gogo专业大尺度亚洲高清人体,美女张开双腿让男生桶,亚洲av无码一区二区三区鸳鸯影院,久久久久国产精品人妻

當前位置:首頁 > 嵌入式培訓 > 嵌入式學習 > 學習筆記 > 嵌入式學習筆記:C語言之變量、其生命周期、運算符詳解

嵌入式學習筆記:C語言之變量、其生命周期、運算符詳解 時間:2018-09-18      來源:未知

1、變量

定義:創(chuàng)建一個對象,為這個對象分配一塊內(nèi)存,并為它取一個名字,這個名字就叫做變量名;是對程序中數(shù)據(jù)的存儲空間的抽象。

存儲類型 數(shù)據(jù)類型 變量名;

描述:

一個變量可以通過不同種的方式來描述。

存儲期:

變量在內(nèi)存中的保存時間

作用域:

程序的哪些部分通過變量名來使用變量

鏈接點:

程序的哪些部分通過變量名來使用變量

全局變量:也稱為外部變量,定義在函數(shù)體外部的變量,不屬于哪個函數(shù),屬于整個

程序;

局部變量:也稱為內(nèi)部變量,定義在函數(shù)體內(nèi)部的變量,只能在函數(shù)內(nèi)部使用;

存儲類型:auto register static extern

auto:聲明的變量是自動變量,聲明的變量存放在堆棧區(qū),而且auto可以省略。

register:寄存器型,聲明的變量放在CPU內(nèi)部的寄存器中,可以加快程序的運

行速度,如果申請不到,同auto;

定義與聲明的區(qū)別:定義分配內(nèi)存,聲明不分配內(nèi)存;

extern:

1、聲明的變量必須是全局變量;

2、編譯時必須同時編譯兩個文件;

3、聲明的變量必須被定義過。

static:

1、修飾局部變量,如果該局部變量沒有被初始化,其值為0,并且該局部變量只會被初始化一次;生命周期發(fā)生改變。

注:局部變量如果沒有被初始化,其值為隨機值;

2、修飾全局變量,該全局變量只能在本文件內(nèi)使用;

3、修飾函數(shù)時,該函數(shù)只能在本文件內(nèi)使用;

注:

1、具有外部鏈接的在其他文件使用前必須以exturn聲明

2、具有靜態(tài)存儲期的變量必須使用常量初始化(編譯階段獲得值)

-------與auto最大不同點是:static存儲類型的變量在內(nèi)存中是以固定地址存放的,而不是以堆棧方式存放的;只要整個程序還在繼續(xù)運行靜態(tài)變量就不會隨著說明它的程序段的結(jié)束而消失,它下次再調(diào)用該函數(shù),該存儲類型的變量不再重新說明,而且還保留上次調(diào)

用存入的數(shù)值。

2、動態(tài)存儲方式與靜態(tài)存儲方式

變量還有另一種屬性——存儲期(storage duration,也稱生命期)。存儲期是指變量在內(nèi)存中的存在期間。這是從變量值存在的時間角度來分析的。存儲期可以分為靜態(tài)存儲期(static storage duration)和動態(tài)存儲期(dynamic storage duration)。這是由變量

的靜態(tài)存儲方式和動態(tài)存儲方式?jīng)Q定的。

所謂靜態(tài)存儲方式是指在程序運行期間,系統(tǒng)對變量分配固定的存儲空間。而動態(tài)存儲方式則是在程序運行期間,系統(tǒng)對變量動態(tài)地分配存儲空間。

先看一下內(nèi)存中的供用戶使用的存儲空間的情況。這個存儲空間可以分為三部分,即:

程序區(qū)

靜態(tài)存儲區(qū)

動態(tài)存儲區(qū)

數(shù)據(jù)分別存放在靜態(tài)存儲區(qū)和動態(tài)存儲區(qū)中。全局變量全部存放在靜態(tài)存儲區(qū)中,在程序開始執(zhí)行時給全局變量分配存儲單元,程序執(zhí)行完畢就釋放這些空間。在程序執(zhí)行過程中它們占據(jù)固定的存儲單元,而不是動態(tài)地進行分配和釋放。

在動態(tài)存儲區(qū)中存放以下數(shù)據(jù):

函數(shù)形式參數(shù)。在調(diào)用函數(shù)時給形參分配存儲空間。

函數(shù)中的自動變量(未加static聲明的局部變量,詳見后面的介紹)。

函數(shù)調(diào)用時的現(xiàn)場保護和返回地址等。

對以上這些數(shù)據(jù),在函數(shù)調(diào)用開始時分配動態(tài)存儲空間,函數(shù)結(jié)束時釋放這些空間。在程序執(zhí)行過程中,這種分配和釋放是動態(tài)的,如果在一個程序中兩次調(diào)用同一函數(shù),則要進行兩次分配和釋放,而兩次分配給此函數(shù)中局部變量的存儲空間地址可能是不相同

的。

如果在一個程序中包含若干個函數(shù),每個函數(shù)中的局部變量的存儲期并不等于整個程序的執(zhí)行周期,它只是整個程序執(zhí)行周期的一部分。根據(jù)函數(shù)調(diào)用的情況,系統(tǒng)對局部變量動態(tài)地分配和釋放存儲空間。

在C++中變量除了有數(shù)據(jù)類型的屬性之外,還有存儲類別(storage class) 的屬性。存儲類別指的是數(shù)據(jù)在內(nèi)存中存儲的方法。存儲方法分為靜態(tài)存儲和動態(tài)存儲兩大類。具體包含4種:自動的(auto)、靜態(tài)的(static)、寄存器的(register)和外部的(extern)。根據(jù)變量的存儲類別,可以知道變量的作用域和存儲期。對靜態(tài)局部變量的說明:

靜態(tài)局部變量在靜態(tài)存儲區(qū)內(nèi)分配存儲單元。在程序整個運行期間都不釋放。而自動變量(即動態(tài)局部變量)屬于動態(tài)存儲類別,存儲在動態(tài)存儲區(qū)空間(而不是靜態(tài)存儲區(qū)空間),函數(shù)調(diào)用結(jié)束后即釋放。

為靜態(tài)局部變量賦初值是在編譯時進行值的,即只賦初值一次,在程序運行時它已有初值。以后每次調(diào)用函數(shù)時不再重新賦初值而只是保留上次函數(shù)調(diào)用結(jié)束時的值。而為自動變量賦初值,不是在編譯時進行的,而是在函數(shù)調(diào)用時進行,每調(diào)用一次函數(shù)重新給一次初值,相當于執(zhí)行一次賦值語句。

如果在定義局部變量時不賦初值的話,對靜態(tài)局部變量來說,編譯時自動賦初值0(對數(shù)值型變量)或空字符(對字符型變量)。而對自動變量來說,如果不賦初值,則它的值是一個不確定的值。這是由于每次函數(shù)調(diào)用結(jié)束后存儲單元已釋放,下次調(diào)用時又重新另分

配存儲單元,而所分配的單元中的值是不確定的。

雖然靜態(tài)局部變量在函數(shù)調(diào)用結(jié)束后仍然存在,但其他函數(shù)是不能引用它的,也就是說,在其他函數(shù)中它是“不可見”的。

3、生命周期與作用域

局部變量:

生命周期:從定義開始,到該模塊結(jié)束

作用域:該模塊內(nèi)

static修飾的局部變量:

生命周期:從定義開始,到整個程序結(jié)束

作用域:該模塊內(nèi)

全局變量:

生命周期:從定義開始,到整個程序結(jié)束

作用域:該程序內(nèi)

static修飾的全局變量:

生命周期:從定義開始,到整個程序結(jié)束

作用域:該文件內(nèi)

注:全局變量如果沒有被初始化,其值為0;全局變量要慎用,原因有兩個:

1、命名重復

2、其他函數(shù)可能違背意圖將其值改變

4、類型轉(zhuǎn)換

1、隱式類型轉(zhuǎn)換

(1)低字節(jié)數(shù)向高字節(jié)數(shù)轉(zhuǎn)換

(2)有符號數(shù)向無符號數(shù)轉(zhuǎn)換(int ---> unsigned int)

2、強制類型轉(zhuǎn)換

(數(shù)據(jù)類型)變量名;

注:不管是隱式類型轉(zhuǎn)換還是強制類型轉(zhuǎn)換,實際上變量的類型并沒有發(fā)生變化,只是在運算的過程當中發(fā)生了轉(zhuǎn)換。

5、運算符

算術(shù)運算符、關(guān)系運算符、邏輯運算符、位運算符

1、算術(shù)運算符:+ - * / % ++ --

%:取模運算,小數(shù)沒有取模運算

++

int a = 5;

int b

= a++;

a = 7, b = 5, c = 7

注:

++在前,先賦值,后運算

++在后,先運算,后賦值

當++單獨成一條語句時,++在前和在后沒有區(qū)別;

2、關(guān)系運算符 > < >= <= == !=

注:

=為賦值運算符

==為等于號

if(5 == a)

3、邏輯運算符 && || !

表達式1 && 表達式2

表達式1和表達式2同時成立,整個表達式才成立,只要其中有一個不成立,整個表達式就為假

截斷法則:當&&左邊為假時,其值一定為假,所以&&右邊就不執(zhí)行

表達式1 || 表達式2

||兩邊同時為假時,其值才為假,只要有一邊表達式為真,其值一定為真截斷法則:當||左邊為真時,其值一定為真,右邊不執(zhí)行

4、位運算符:~ & | ^ >> <<

~00001111 11110000

&:00100010

10110000

00100000

1)、判斷某個數(shù)的某一位或某幾位是0還是1

10011011 判斷第四位是0還是1

& 00010000

00010000

2)、清除某個數(shù)的某一位或某幾位

10011011 清除第3到5位

& 11000111

10000011

3)、設(shè)置某個數(shù)的某一位或某幾位 (先清0,后設(shè)置)先與后或

10011011 設(shè)置第3到5位為101

& 11000111

| 00101000 10101011

^:兩個位進行異或時,相同為0,不同為1

一個數(shù)與0相異或,結(jié)果是其本身

翻轉(zhuǎn)某個數(shù)的某一位段

1100 0001 翻轉(zhuǎn)第3到5位

^ 00111000

11111001

>>:右移

1、溢出部分不要

2、高位:正數(shù) 高位補0

負數(shù) 補1

<<:左移

1、溢出時,溢出部分不要,右邊補0

2、如果是有符號數(shù),可能會引起符號位的改變

5、逗號運算符:

表達式1,表達式2;

其求值過程是分別求兩個表達式的值,并以表達式2的值作為整個逗號表達

式的值。

表達式1,表達式2,表達式3,。。。。。。。。表達式n;

每個表達式都會執(zhí)行,并把表達式n的值作為整個表達式的值。

上一篇:嵌入式學習筆記:數(shù)據(jù)的輸入輸出

下一篇:嵌入式學習筆記:守護進程,線程詳解

熱點文章推薦
華清學員就業(yè)榜單
高薪學員經(jīng)驗分享
熱點新聞推薦
前臺專線:010-82525158 企業(yè)培訓洽談專線:010-82525379 院校合作洽談專線:010-82525379 Copyright © 2004-2022 北京華清遠見科技集團有限公司 版權(quán)所有 ,京ICP備16055225號-5京公海網(wǎng)安備11010802025203號

回到頂部