嵌(qian)入式學習筆記(ji):C語言之變(bian)量、其生命周期(qi)、運(yun)算符詳解
時(shi)間:2018-09-18 來源:未知
1、變量
定義(yi):創建一(yi)(yi)個對(dui)象(xiang),為這個對(dui)象(xiang)分配一(yi)(yi)塊內存,并為它取一(yi)(yi)個名(ming)字,這個名(ming)字就叫做(zuo)變量名(ming);是對(dui)程序中數據(ju)的存儲空(kong)間的抽(chou)象(xiang)。
存儲(chu)類型 數據類型 變量(liang)名;
描述:
一個(ge)變量可以通過不同種的方式來描述。
存儲期:
變(bian)量在內存中(zhong)的保(bao)存時間
作用域:
程序(xu)的(de)哪些部分(fen)通過變量名來使用變量
鏈接點:
程序的哪些部分通過變量(liang)(liang)名來使用變量(liang)(liang)
全(quan)局(ju)變量:也稱為外部變量,定(ding)義在函數體外部的變量,不(bu)屬(shu)于哪個函數,屬(shu)于整個
程序;
局(ju)部(bu)變(bian)量:也稱為內(nei)部(bu)變(bian)量,定義(yi)在(zai)函(han)數體內(nei)部(bu)的變(bian)量,只能在(zai)函(han)數內(nei)部(bu)使用(yong);
存儲類(lei)型:auto register static extern
auto:聲(sheng)明(ming)的變(bian)量(liang)是自動變(bian)量(liang),聲(sheng)明(ming)的變(bian)量(liang)存放在堆棧區,而(er)且auto可以省(sheng)略(lve)。
register:寄存(cun)器(qi)型,聲明的(de)(de)變量放在CPU內部的(de)(de)寄存(cun)器(qi)中,可(ke)以加快程序的(de)(de)運
行(xing)速度,如果申請不到,同auto;
定義與聲(sheng)(sheng)明(ming)的(de)區別(bie):定義分配(pei)(pei)內(nei)存,聲(sheng)(sheng)明(ming)不分配(pei)(pei)內(nei)存;
extern:
1、聲明的變(bian)量必須是全局變(bian)量;
2、編譯時必(bi)須同時編譯兩(liang)個文件;
3、聲明的變量必須被定(ding)義(yi)過。
static:
1、修(xiu)飾局部變量(liang),如果該局部變量(liang)沒有(you)被初始(shi)化(hua),其值為0,并且該局部變量(liang)只會被初始(shi)化(hua)一次;生命周期發(fa)生改變。
注:局部(bu)變(bian)量(liang)如果沒有被初始(shi)化,其(qi)值(zhi)為隨機值(zhi);
2、修飾全局變(bian)量(liang),該全局變(bian)量(liang)只能在(zai)本文件內(nei)使(shi)用(yong);
3、修飾函數(shu)時(shi),該(gai)函數(shu)只能在本(ben)文件內使用;

注:
1、具有外(wai)部鏈(lian)接的在其他文件使用前必須以(yi)exturn聲明
2、具有靜(jing)態存儲期的變量必須(xu)使用常量初始化(hua)(編譯階段(duan)獲得(de)值)

-------與auto最大(da)不同點是(shi):static存(cun)儲(chu)類型的(de)(de)(de)變量在(zai)內存(cun)中是(shi)以固定地(di)址存(cun)放(fang)(fang)的(de)(de)(de),而(er)不是(shi)以堆棧方式存(cun)放(fang)(fang)的(de)(de)(de);只要整個程序還在(zai)繼續(xu)運行靜態變量就不會隨(sui)著說明它(ta)的(de)(de)(de)程序段的(de)(de)(de)結束(shu)而(er)消失,它(ta)下次再(zai)(zai)調(diao)用(yong)該(gai)函數,該(gai)存(cun)儲(chu)類型的(de)(de)(de)變量不再(zai)(zai)重新說明,而(er)且還保留上次調(diao)
用存入(ru)的(de)數值。
2、動態存儲方式(shi)與靜態存儲方式(shi)
變量(liang)還有另一種屬性——存(cun)(cun)(cun)(cun)儲(chu)期(qi)(qi)(storage duration,也稱生命(ming)期(qi)(qi))。存(cun)(cun)(cun)(cun)儲(chu)期(qi)(qi)是(shi)指變量(liang)在(zai)內存(cun)(cun)(cun)(cun)中的存(cun)(cun)(cun)(cun)在(zai)期(qi)(qi)間(jian)。這是(shi)從變量(liang)值存(cun)(cun)(cun)(cun)在(zai)的時間(jian)角度來分析的。存(cun)(cun)(cun)(cun)儲(chu)期(qi)(qi)可以分為靜態(tai)存(cun)(cun)(cun)(cun)儲(chu)期(qi)(qi)(static storage duration)和(he)動態(tai)存(cun)(cun)(cun)(cun)儲(chu)期(qi)(qi)(dynamic storage duration)。這是(shi)由變量(liang)
的靜態存(cun)(cun)儲方式和動(dong)態存(cun)(cun)儲方式決定的。
所謂靜態(tai)存(cun)儲方(fang)式是(shi)指(zhi)在程(cheng)序運行(xing)期間,系統對變量(liang)分配(pei)(pei)固定的存(cun)儲空(kong)間。而(er)動(dong)態(tai)存(cun)儲方(fang)式則是(shi)在程(cheng)序運行(xing)期間,系統對變量(liang)動(dong)態(tai)地分配(pei)(pei)存(cun)儲空(kong)間。
先(xian)看一下內存中的(de)(de)供用戶使用的(de)(de)存儲空(kong)(kong)間的(de)(de)情況。這個存儲空(kong)(kong)間可(ke)以分(fen)為三(san)部分(fen),即:
程序區
靜態存儲區
動態存儲區
數(shu)據分別存(cun)(cun)(cun)(cun)放在(zai)靜態(tai)存(cun)(cun)(cun)(cun)儲(chu)區和(he)動態(tai)存(cun)(cun)(cun)(cun)儲(chu)區中(zhong)(zhong)。全(quan)局變量全(quan)部存(cun)(cun)(cun)(cun)放在(zai)靜態(tai)存(cun)(cun)(cun)(cun)儲(chu)區中(zhong)(zhong),在(zai)程(cheng)(cheng)序開始執行(xing)時(shi)給全(quan)局變量分配存(cun)(cun)(cun)(cun)儲(chu)單(dan)元,程(cheng)(cheng)序執行(xing)完畢就釋放這些空(kong)間。在(zai)程(cheng)(cheng)序執行(xing)過程(cheng)(cheng)中(zhong)(zhong)它們占據固(gu)定的存(cun)(cun)(cun)(cun)儲(chu)單(dan)元,而不是動態(tai)地進行(xing)分配和(he)釋放。
在動態(tai)存儲區中存放以下數據:
函數(shu)形(xing)式參(can)數(shu)。在調用(yong)函數(shu)時給形(xing)參(can)分配存儲空間(jian)。
函數(shu)中的自(zi)動(dong)變量(liang)(未(wei)加static聲(sheng)明的局部(bu)變量(liang),詳見后面的介紹(shao))。
函(han)數調用(yong)時的現場保(bao)護(hu)和返回(hui)地址等。
對以上這(zhe)些(xie)數據,在(zai)函數調(diao)用(yong)開始時分配(pei)(pei)(pei)動(dong)態存儲(chu)空間,函數結(jie)束(shu)時釋放(fang)這(zhe)些(xie)空間。在(zai)程(cheng)序執行(xing)過程(cheng)中,這(zhe)種分配(pei)(pei)(pei)和釋放(fang)是(shi)動(dong)態的,如果在(zai)一(yi)(yi)個(ge)程(cheng)序中兩(liang)(liang)次調(diao)用(yong)同(tong)一(yi)(yi)函數,則要進行(xing)兩(liang)(liang)次分配(pei)(pei)(pei)和釋放(fang),而兩(liang)(liang)次分配(pei)(pei)(pei)給此(ci)函數中局部變量的存儲(chu)空間地址可能是(shi)不(bu)相同(tong)
的。
如果在(zai)一個程序中包(bao)含若(ruo)干個函數(shu),每個函數(shu)中的(de)局部變量的(de)存儲(chu)期(qi)并不等于整個程序的(de)執(zhi)行(xing)周期(qi),它(ta)只是(shi)整個程序執(zhi)行(xing)周期(qi)的(de)一部分。根據函數(shu)調(diao)用的(de)情況,系統對局部變量動態地分配和(he)釋放存儲(chu)空間。
在C++中(zhong)變(bian)量除(chu)了有(you)數據類型的(de)屬性之外(wai)(wai),還有(you)存(cun)(cun)儲(chu)(chu)類別(storage class) 的(de)屬性。存(cun)(cun)儲(chu)(chu)類別指的(de)是數據在內存(cun)(cun)中(zhong)存(cun)(cun)儲(chu)(chu)的(de)方法。存(cun)(cun)儲(chu)(chu)方法分為靜(jing)態(tai)存(cun)(cun)儲(chu)(chu)和(he)動態(tai)存(cun)(cun)儲(chu)(chu)兩大類。具體(ti)包含4種:自(zi)動的(de)(auto)、靜(jing)態(tai)的(de)(static)、寄存(cun)(cun)器的(de)(register)和(he)外(wai)(wai)部的(de)(extern)。根(gen)據變(bian)量的(de)存(cun)(cun)儲(chu)(chu)類別,可以知道變(bian)量的(de)作(zuo)用域和(he)存(cun)(cun)儲(chu)(chu)期。對靜(jing)態(tai)局部變(bian)量的(de)說(shuo)明:
靜(jing)態局部變量在靜(jing)態存(cun)儲(chu)區內(nei)分配存(cun)儲(chu)單元。在程序整個運行(xing)期間(jian)都不釋放。而(er)自動(dong)變量(即動(dong)態局部變量)屬于動(dong)態存(cun)儲(chu)類(lei)別,存(cun)儲(chu)在動(dong)態存(cun)儲(chu)區空間(jian)(而(er)不是(shi)靜(jing)態存(cun)儲(chu)區空間(jian)),函數(shu)調用結束后即釋放。
為(wei)靜態(tai)局(ju)部變(bian)量賦(fu)初(chu)值(zhi)(zhi)是(shi)(shi)在編(bian)譯時(shi)進(jin)(jin)行值(zhi)(zhi)的,即只賦(fu)初(chu)值(zhi)(zhi)一次(ci)(ci)(ci),在程序運行時(shi)它已有初(chu)值(zhi)(zhi)。以后每次(ci)(ci)(ci)調(diao)用函數時(shi)不再重新賦(fu)初(chu)值(zhi)(zhi)而只是(shi)(shi)保留上次(ci)(ci)(ci)函數調(diao)用結(jie)束時(shi)的值(zhi)(zhi)。而為(wei)自動變(bian)量賦(fu)初(chu)值(zhi)(zhi),不是(shi)(shi)在編(bian)譯時(shi)進(jin)(jin)行的,而是(shi)(shi)在函數調(diao)用時(shi)進(jin)(jin)行,每調(diao)用一次(ci)(ci)(ci)函數重新給一次(ci)(ci)(ci)初(chu)值(zhi)(zhi),相當于執行一次(ci)(ci)(ci)賦(fu)值(zhi)(zhi)語句。
如果在(zai)定(ding)義(yi)局(ju)(ju)部變(bian)量時(shi)不賦(fu)初(chu)值的話,對靜態(tai)局(ju)(ju)部變(bian)量來(lai)說,編譯時(shi)自動賦(fu)初(chu)值0(對數(shu)(shu)值型變(bian)量)或空字(zi)符(對字(zi)符型變(bian)量)。而(er)對自動變(bian)量來(lai)說,如果不賦(fu)初(chu)值,則它的值是一個不確定(ding)的值。這是由于(yu)每(mei)次函數(shu)(shu)調用結束(shu)后存儲單元(yuan)已(yi)釋放,下次調用時(shi)又重新(xin)另(ling)分
配(pei)存儲單元,而所分配(pei)的(de)(de)單元中(zhong)的(de)(de)值是不確定的(de)(de)。
雖(sui)然(ran)(ran)靜(jing)態局部變量在(zai)函(han)數(shu)(shu)調用(yong)結束后仍然(ran)(ran)存在(zai),但其(qi)他(ta)函(han)數(shu)(shu)是不能(neng)引用(yong)它(ta)的(de)(de),也(ye)就是說,在(zai)其(qi)他(ta)函(han)數(shu)(shu)中它(ta)是“不可見”的(de)(de)。
3、生命周(zhou)期與(yu)作用域
局部變量:
生命周(zhou)期:從定義開(kai)始,到該模塊(kuai)結束
作(zuo)用(yong)域:該(gai)模塊(kuai)內
static修飾的局(ju)部變量:
生命(ming)周(zhou)期:從定(ding)義(yi)開(kai)始,到(dao)整個程序(xu)結(jie)束
作用域(yu):該模(mo)塊內
全局變量:
生命周期:從定義開始(shi),到整(zheng)個程(cheng)序(xu)結束
作用(yong)域:該(gai)程(cheng)序內(nei)
static修飾的全局變量:
生命周期:從定義(yi)開始,到(dao)整個程序結(jie)束
作用域:該文件內
注:全局變量如果沒有被初始化,其(qi)值為(wei)0;全局變量要慎用,原因有兩(liang)個:
1、命名重復
2、其(qi)他函數(shu)可(ke)能違背意圖(tu)將其(qi)值(zhi)改變
4、類型(xing)轉換
1、隱式(shi)類型(xing)轉換
(1)低字(zi)節數向(xiang)高字(zi)節數轉換
(2)有符(fu)號數向無符(fu)號數轉(zhuan)換(int ---> unsigned int)

2、強制類型轉換
(數據類型)變量名;
注:不管是隱(yin)式類(lei)型(xing)轉(zhuan)(zhuan)換還是強制類(lei)型(xing)轉(zhuan)(zhuan)換,實際(ji)上變(bian)量(liang)的類(lei)型(xing)并沒有(you)發生變(bian)化(hua),只是在運算的過程(cheng)當中發生了轉(zhuan)(zhuan)換。
5、運算符
算術運(yun)算符(fu)、關系運(yun)算符(fu)、邏輯運(yun)算符(fu)、位運(yun)算符(fu)
1、算術運算符:+ - * / % ++ --
%:取模運(yun)算,小數沒有取模運(yun)算
++
int a = 5;
int b
= a++;
a = 7, b = 5, c = 7
注:
++在前,先賦值,后運算
++在后,先運算(suan),后賦值
當++單獨(du)成一條語句時,++在前(qian)和在后沒(mei)有區別(bie);
2、關系(xi)運(yun)算(suan)符 > < >= <= == !=
注:
=為賦值(zhi)運(yun)算(suan)符(fu)
==為等于號
if(5 == a)
3、邏輯運算符(fu) && || !
表(biao)達式1 && 表(biao)達式2
表(biao)達式1和表(biao)達式2同時成立,整個(ge)表(biao)達式才成立,只(zhi)要其中有一個(ge)不成立,整個(ge)表(biao)達式就(jiu)為(wei)假
截斷(duan)法(fa)則:當&&左邊為假時,其值一(yi)定為假,所以&&右邊就不執行
表(biao)達式1 || 表(biao)達式2
||兩邊同時(shi)為(wei)(wei)假(jia)時(shi),其值才為(wei)(wei)假(jia),只(zhi)要有一邊表達(da)式(shi)為(wei)(wei)真,其值一定為(wei)(wei)真截(jie)斷法則:當||左邊為(wei)(wei)真時(shi),其值一定為(wei)(wei)真,右邊不(bu)執行(xing)
4、位運算(suan)符:~ & | ^ >> <<
~00001111 11110000
&:00100010
10110000
00100000
1)、判斷某個數的某一(yi)位(wei)或某幾位(wei)是(shi)0還是(shi)1
10011011 判斷第四(si)位是(shi)0還(huan)是(shi)1
& 00010000
00010000
2)、清(qing)除某個數的某一位或某幾(ji)位
10011011 清除第(di)3到5位
& 11000111
10000011
3)、設(she)置某個數的(de)某一位或(huo)某幾位 (先清0,后(hou)設(she)置)先與后(hou)或(huo)
10011011 設(she)置第3到5位為101
& 11000111
| 00101000 10101011
^:兩(liang)個位進行異或(huo)時(shi),相(xiang)同(tong)為0,不同(tong)為1
一個數與(yu)0相異或,結(jie)果是其本身
翻轉某(mou)個(ge)數的某(mou)一位段
1100 0001 翻轉第3到5位
^ 00111000
11111001
>>:右移
1、溢出(chu)部(bu)分(fen)不要(yao)
2、高位:正數 高位補0
負數 補1
<<:左移
1、溢出時,溢出部分不要(yao),右邊補(bu)0
2、如果是有符(fu)號(hao)數,可(ke)能會引(yin)起符(fu)號(hao)位的改變
5、逗號運算符(fu):
表(biao)達式(shi)1,表(biao)達式(shi)2;
其求(qiu)值(zhi)過程是(shi)分別求(qiu)兩個表(biao)達式的值(zhi),并以表(biao)達式2的值(zhi)作為整個逗號表(biao)達
式的值。
表達式1,表達式2,表達式3,。。。。。。。。表達式n;
每個(ge)表達(da)(da)式(shi)都會執行(xing),并把表達(da)(da)式(shi)n的值(zhi)作為整個(ge)表達(da)(da)式(shi)的值(zhi)。

