官术网_书友最值得收藏!

2.3 內(nèi)存和變量

在計(jì)算機(jī)內(nèi)部,數(shù)據(jù)的存取操作都是通過所依附的連續(xù)多字節(jié)內(nèi)存空間來進(jìn)行的。但在程序中,如何來引用這些數(shù)據(jù)的內(nèi)存空間呢?通過內(nèi)存空間的首地址,是引用的一種方法。那么能否用一個(gè)標(biāo)識(shí)符將其和一塊內(nèi)存空間綁定在一起呢?如果可以的話,該如何綁定呢?標(biāo)識(shí)符又是如何命名的呢?

2.3.1 標(biāo)識(shí)符

標(biāo)識(shí)符(Identifiers)是獨(dú)立的有效字符序列,是給程序中的一些程序元素(如變量、函數(shù)、數(shù)組等)所起的名字。在C語(yǔ)言中,一個(gè)合法的標(biāo)識(shí)符應(yīng)遵循下列規(guī)則:

(1)標(biāo)識(shí)符由大小寫英文字母、數(shù)字字符(0~9)和下畫線組成,且第一個(gè)字符必須為字母或下畫線,其后跟零個(gè)或多個(gè)字母、數(shù)字或下畫線。例如,nLong, _, __(兩個(gè)下畫線),_123都是合法的標(biāo)識(shí)符。但標(biāo)識(shí)符中不能有空格、標(biāo)點(diǎn)符號(hào)、運(yùn)算符或其他字符,例如,下面的標(biāo)識(shí)符就是不合法的:

(2)C語(yǔ)言中的大小寫是敏感的。也就是說,大寫字母與小寫字母分別代表不同的標(biāo)識(shí)符。例如,data,Data,DaTa,DATA等都是不同的標(biāo)識(shí)符。盡管如此,也盡量不要將兩個(gè)標(biāo)識(shí)符定義成字母相同、大小寫不同的標(biāo)識(shí)符。

(3)不能與關(guān)鍵字同名。所謂關(guān)鍵字,是指由系統(tǒng)內(nèi)部定義的,具有特殊含義和用途的標(biāo)識(shí)符,程序中不能另做他用。以下是32個(gè)ANSI C關(guān)鍵字:

auto     break    case     char     const    continue
default   do      double   else      enum    extern
float     for      goto     if       int      long
register   return   short    signed   sizeof    static
struct    switch   typedef   union    unsigned  void
volatile   while

需要說明的是:程序中定義的標(biāo)識(shí)符除了不能與關(guān)鍵字同名外,還應(yīng)不與系統(tǒng)庫(kù)文件中預(yù)定義的標(biāo)識(shí)符或庫(kù)函數(shù)同名,如以前遇到的printf,scanf等;最好也不要與關(guān)鍵字相似或只是大小寫區(qū)別,如Int,Long等,雖然這在C語(yǔ)言中是合法的,但在有的C編譯器中可能會(huì)將Int和Long看做是int和long的別名,可見它們都是不好的標(biāo)識(shí)符。再如,include, define雖是合法的標(biāo)識(shí)符,但它和預(yù)處理命令#include,#define相似,也是不好的。

除了遵循上述規(guī)則外,標(biāo)識(shí)符命名時(shí)還應(yīng)考慮以下兩點(diǎn)。

(1)要考慮標(biāo)識(shí)符的有效長(zhǎng)度。即組成標(biāo)識(shí)符的字符個(gè)數(shù)不要太多,一般不能超過32個(gè),因?yàn)橛械木幾g系統(tǒng)只能識(shí)別前32個(gè)字符,也就是說前32個(gè)字符相同的兩個(gè)不同標(biāo)識(shí)符會(huì)被某些系統(tǒng)認(rèn)為是同一個(gè)標(biāo)識(shí)符。

(2)要考慮標(biāo)識(shí)符的易讀性。例如,a1b1,c1d雖然是合法的標(biāo)識(shí)符,但卻是不好的標(biāo)識(shí)符,因?yàn)樗荒茏屓死斫馑鼈兯淼暮x。在定義標(biāo)識(shí)符時(shí),若能做到“見名知義”就能達(dá)到提高易讀性的目的。

2.3.2 變量和變量定義

有了標(biāo)識(shí)符的規(guī)則,就可以為程序中的變量起一個(gè)名稱。那么,什么是變量呢?變量是如何使用的呢?

1.變量的含義

變量,顧名思義,是指其值是可以改變的量。但在C語(yǔ)言中,變量的含義還不止這些。

前面已提及,程序中的數(shù)據(jù)是通過內(nèi)存來操作的。但由于不同的編譯系統(tǒng)為同一個(gè)數(shù)據(jù)所開辟的內(nèi)存的地址不一定相同,因此為了方便編程人員使用,允許通過一個(gè)標(biāo)識(shí)符來標(biāo)識(shí)所使用的內(nèi)存空間。這個(gè)標(biāo)識(shí)符在程序中稱為變量的名稱。為了能精確地反映這個(gè)內(nèi)存空間的大小,變量還必須要有數(shù)據(jù)類型,數(shù)據(jù)類型同時(shí)還反映這個(gè)內(nèi)存空間存取的是怎樣的數(shù)據(jù)以及數(shù)據(jù)值的范圍。

可見,與數(shù)學(xué)中的變量概念有著本質(zhì)的不同,程序中的變量是計(jì)算機(jī)內(nèi)部的某塊內(nèi)存空間在程序中的標(biāo)識(shí)。在程序中,使用變量就是使用該變量所綁定的內(nèi)存空間。那么變量名和內(nèi)存空間是如何綁定的呢?這就需要在程序中對(duì)變量進(jìn)行定義。

2.變量的定義

C語(yǔ)言在定義變量時(shí)先寫數(shù)據(jù)類型,然后是變量名,數(shù)據(jù)類型和變量名之間必須用一個(gè)或多個(gè)空格來分隔,最后以分號(hào)來結(jié)尾,即如下列格式的變量定義語(yǔ)句:

<數(shù)據(jù)類型> <變量名1>[ , <變量名2>, …];

凡格式中出現(xiàn)的尖括號(hào)“< >”,表示括號(hào)中的內(nèi)容必須是指定的,若為方括號(hào)“[ ]”,則括號(hào)中的內(nèi)容是可選的,本書做此約定

數(shù)據(jù)類型告訴編譯器要為由變量名指定的變量分配多少字節(jié)的內(nèi)存空間,以及變量中要存取的是什么類型的數(shù)據(jù)。例如:

double    x;                       /* 雙精度實(shí)型變量 */

一旦編譯,系統(tǒng)就會(huì)自動(dòng)將x這個(gè)標(biāo)識(shí)符和10字節(jié)(以ANSI C為準(zhǔn))的連續(xù)內(nèi)存空間相綁定,直到x生存期結(jié)束為止。也可以說,上述定義編譯后,系統(tǒng)就會(huì)為x變量根據(jù)其類型(double)開辟10字節(jié)的內(nèi)存空間。或者說,x占用了10字節(jié)的連續(xù)內(nèi)存空間,存取的數(shù)據(jù)類型是double型,稱之為雙精度實(shí)型變量。再如:

float y;                           /* 單精度實(shí)型變量 */

則y占用了4字節(jié)的連續(xù)內(nèi)存空間,存取的數(shù)據(jù)類型是float型,稱之為單精度實(shí)型變量。此后,變量x,y就分別對(duì)應(yīng)于各自的內(nèi)存空間,換句話說,開辟的那塊8字節(jié)的內(nèi)存空間就稱為x,另一塊4字節(jié)的內(nèi)存空間就稱為y。又如:

int  nNum1;                       /* 整型變量 */
int  nNum2;                       /* 整型變量 */
int  nNum3;                       /* 整型變量 */

則在ANSI C中,nNum1,nNum2,nNum3分別占用2字節(jié)的存儲(chǔ)空間,其存取的數(shù)據(jù)類型是int型,稱之為整型變量。由于它們都是同一類型的變量,因此為使代碼簡(jiǎn)潔,可將同類型的變量定義在1行語(yǔ)句中。不過,同類型的變量名要用逗號(hào)“,”分隔(逗號(hào)前后可以有0個(gè)或多個(gè)空格)。例如,這3個(gè)整型變量可這樣定義(注意:只有最后一個(gè)變量nNum3的后面才有分號(hào)):

int  nNum1,nNum2,nNum3;

需要說明:

(1)除了上述整型變量、實(shí)型變量外,還可有字符型變量,即用char定義的變量,這些都是基本數(shù)據(jù)類型變量。實(shí)際上,只要是合法的數(shù)據(jù)類型,均可以用來定義變量。例如:

unsigned short  x,  y,  z;             /* 無(wú)符號(hào)短整型變量 */
long double     pi;                    /* 長(zhǎng)雙精度實(shí)型變量 */

(2)變量是有作用范圍的,稱為變量的作用域(以后會(huì)討論)。C語(yǔ)言規(guī)定:在同一個(gè)作用域中,不能有兩個(gè)或以上相同的標(biāo)識(shí)符(變量名)。例如:

float x,  y,  z;                     /* 單精度實(shí)型變量 */
int  x;                              /* 錯(cuò)誤,變量x重復(fù)定義 */
float y;                             /* 錯(cuò)誤,變量y重復(fù)定義 */

3.定義位置

在C語(yǔ)言中,對(duì)變量定義的位置還有下列一些規(guī)定。

(1)在由左花括號(hào)“{”和右花括號(hào)“}”構(gòu)成的函數(shù)體或語(yǔ)句塊中,變量定義語(yǔ)句必須出現(xiàn)在函數(shù)體或語(yǔ)句塊中的最前面,且變量定義語(yǔ)句的前面不能存在其他非變量定義語(yǔ)句或非說明語(yǔ)句。例如:

int main()
{
    int   a;                       /* 合法 */
    int   x;                       /* 合法 */
    x=8;                         /* 賦值語(yǔ)句 */
    int   y;                       /* 不合法,前面出現(xiàn)非變量定義語(yǔ)句 */
    {
        int  c;                   /* 合法 */
        …
    }
    …
    return 0;
}

(2)可以在main函數(shù)外定義變量(稱為全局變量,以后還會(huì)討論),定義的位置雖沒限定,但一定要遵循先定義后使用的原則。

2.3.3 變量賦值和初始化

變量一旦定義后,就可以通過引用變量來進(jìn)行賦值等操作。所謂引用變量,就是使用變量名來引用變量的內(nèi)存空間。由于變量是內(nèi)存空間的一個(gè)標(biāo)識(shí),因此對(duì)變量的操作也是對(duì)其內(nèi)存空間的操作。例如:

int  x,  y;
x=8;                         /* 給x賦值 */
y=x;                         /* 將x的值賦給y*/

“x = 8;”和“y = x;”都是變量的賦值操作,“=”是賦值運(yùn)算符。由于變量名x和y是它們的內(nèi)存空間的標(biāo)識(shí)符(名稱),因此,“x = 8;”是將運(yùn)算符“=”右邊的數(shù)據(jù)8存儲(chǔ)到左邊變量x的內(nèi)存空間中。而“y = x;”這一操作則包括兩個(gè)過程:先獲取x的內(nèi)存空間中存儲(chǔ)的值(此時(shí)為8),然后將該值存儲(chǔ)到y(tǒng)的內(nèi)存空間中。其操作過程可用圖2.5來表示。

圖2.5 “x = 8; ”和“y = x;”賦值操作

當(dāng)首次引用一個(gè)變量時(shí),變量必須要有一個(gè)確定的值,這個(gè)值就是變量的初值。在C語(yǔ)言中,可用下列方法給變量賦初值。

(1)在變量定義后,使用賦值語(yǔ)句來賦初值。如前面的“x = 8;”和“y = x;”,使x和y的初值都為8。

(2)在變量定義的同時(shí)賦給變量初值,這一過程稱為變量初始化,此時(shí)的“=”不是賦值運(yùn)算符,而是初始化的特征符。例如:

int  nNum1=3;                /* 指定nNum1為整型變量,初值為3*/
double    x=1.28;              /* 指定x為雙精度實(shí)變量,初值為1.28*/

(3)也可以在多個(gè)變量的定義語(yǔ)句中單獨(dú)對(duì)某個(gè)變量進(jìn)行初始化,如:

int    nNum1,  nNum2=3,  nNum3;

表示nNum1, nNum2,nNum3為整型變量,但只有nNum2的初值為3。

注意:一個(gè)沒有初值的變量并不表示它所在的內(nèi)存空間沒有數(shù)值,而是取決于編譯器為其開辟內(nèi)存空間時(shí)的處理方式,它可能是系統(tǒng)默認(rèn)值或是該內(nèi)存空間以前操作后留下來的數(shù)值,稱為無(wú)效值

總之,C語(yǔ)言中的變量是某個(gè)內(nèi)存空間的標(biāo)識(shí),它通常有3個(gè)基本要素:C合法的變量名、變量的數(shù)據(jù)類型和變量的數(shù)值;在變量使用之前,必須先對(duì)它進(jìn)行定義。

主站蜘蛛池模板: 泰和县| 友谊县| 玛沁县| 莆田市| 甘洛县| 西盟| 郧西县| 白玉县| 武平县| 上虞市| 区。| 丰都县| 巢湖市| 利辛县| 朝阳县| 广平县| 河源市| 镇原县| 长岛县| 巴青县| 靖州| 仙居县| 潼关县| 万年县| 竹北市| 乌兰浩特市| 衡东县| 香港| 沛县| 定陶县| 鄂伦春自治旗| 伊宁市| 英吉沙县| 日喀则市| 大城县| 桃园市| 义乌市| 晋城| 新源县| 望奎县| 泌阳县|