C語(yǔ)言程序設(shè)計(jì)(第4章函數(shù))2

字號(hào):

4.2 函數(shù)的作用域規(guī)則
     “語(yǔ)言的作用域規(guī)則”是一組確定一部分代碼是否“可見”或可訪問(wèn)另一部分代碼和數(shù)據(jù)的規(guī)則。
     C語(yǔ)言中的每一個(gè)函數(shù)都是一個(gè)獨(dú)立的代碼塊。一個(gè)函數(shù)的代碼塊是隱藏于函數(shù)內(nèi)部的,不能被任何其它函數(shù)中的任何語(yǔ)句(除調(diào)用它的語(yǔ)句之外)所訪問(wèn)(例如,用go to語(yǔ)句跳轉(zhuǎn)到另一個(gè)函數(shù)內(nèi)部是不可能的)。構(gòu)成一個(gè)函數(shù)體的代碼對(duì)程序的其它部分來(lái)說(shuō)是隱蔽的,它既不能影響程序其它部分,也不受其它部分的影響。換言之,由于兩個(gè)函數(shù)有不同的作用域,定義在一個(gè)函數(shù)內(nèi)部的代碼數(shù)據(jù)無(wú)法與定義在另一個(gè)函數(shù)內(nèi)部的代碼和數(shù)據(jù)相互作用。
     C語(yǔ)言中所有的函數(shù)都處于同一作用域級(jí)別上。這就是說(shuō),把一個(gè)函數(shù)定義于另一個(gè)函數(shù)內(nèi)部是不可能的。
    4.2.1 局部變量
     在函數(shù)內(nèi)部定義的變量成為局部變量。在某些C語(yǔ)言教材中,局部變量稱為自動(dòng)變量,這就與使用可選關(guān)鍵字auto定義局部變量這一作法保持一致。局部變量?jī)H由其被定義的模塊內(nèi)部的語(yǔ)句所訪問(wèn)。換言之,局部變量在自己的代碼模塊之外是不可知的。切記:模塊以左花括號(hào)開始,以右花括號(hào)結(jié)束。
     對(duì)于局部變量,要了解的最重要的東西是:它們僅存在于被定義的當(dāng)前執(zhí)行代碼塊中,即局部變量在進(jìn)入模塊時(shí)生成,在退出模塊時(shí)消亡。
     定義局部變量的最常見的代碼塊是函數(shù)。例如,考慮下面兩個(gè)函數(shù)。
    [例4 - 5 ]
    func1( )
    {
     int x; /* 可定義為auto int x; */
     x = 10 ;
    }
    func2( )
    {
     int x; /* 可定義為auto int x; */
     x = -1999;
    }
     整數(shù)變量x被定義了兩次,一次在func1( )中,一次在func2( )中。func1( )和func2( )中的x互不相關(guān)。其原因是每個(gè)x作為局部變量?jī)H在被定義的塊內(nèi)可知。
     語(yǔ)言中包括了關(guān)鍵字auto,它可用于定義局部變量。但自從所有的非全局變量的缺省值假定為auto以來(lái),auto就幾乎很少使用了,因此在本書所有的例子中,均見不到這一關(guān)鍵字。
     在每一函數(shù)模塊內(nèi)的開始處定義所有需要的變量,是最常見的作法。這樣做使得任何人讀此函數(shù)時(shí)都很容易,了解用到的變量。但并非必須這樣做不可,因?yàn)榫植孔兞靠梢栽谌魏文K中定義。為了解其工作原理,請(qǐng)看下面函數(shù)。
    [例4 - 6 ]
    f( )
    {
     int t;
     scanf("%d", &t);
     if(t == 1) {
     char s[80]; /* 此變量?jī)H在這個(gè)塊中起作用* /
     printf("enter name:");
     gets(s); /* 輸入字符串* /
     process(s); /* 函數(shù)調(diào)用* /
     }
    }
     這里的局部變量s就是在i f塊入口處建立,并在其出口處消亡的。因此s僅在i f塊中可知,而在其它地方均不可訪問(wèn),甚至在包含它的函數(shù)內(nèi)部的其它部分也不行。
     在一個(gè)條件塊內(nèi)定義局部變量的主要優(yōu)點(diǎn)是僅在需要時(shí)才為之分配內(nèi)存。這是因?yàn)榫植孔兞績(jī)H在控制轉(zhuǎn)到它們被定義的塊內(nèi)時(shí)才進(jìn)入生存期。雖然大多數(shù)情況下這并不十分重要,但當(dāng)代碼用于專用控制器(如識(shí)別數(shù)字安全碼的車庫(kù)門控制器)時(shí),這就變得十分重要了,因?yàn)檫@時(shí)隨機(jī)存儲(chǔ)器( R A M)極其短缺。
     由于局部變量隨著它們被定義的模塊的進(jìn)出口而建立或釋放,它們存儲(chǔ)的信息在塊工作結(jié)束后也就丟失了。切記,這點(diǎn)對(duì)有關(guān)函數(shù)的訪問(wèn)特別重要。當(dāng)訪問(wèn)一函數(shù)時(shí),它的局部變量被建立,當(dāng)函數(shù)返回時(shí),局部變量被銷毀。這就是說(shuō),局部變量的值不能在兩次調(diào)用之間保持。
    4.2.2 全局變量
     與局部變量不同,全局變量貫穿整個(gè)程序,并且可被任何一個(gè)模塊使用。它們?cè)谡麄€(gè)程序執(zhí)行期間保持有效。全局變量定義在所有函數(shù)之外,可由函數(shù)內(nèi)的任何表達(dá)式訪問(wèn)。在下面的程序中可以看到,變量count定義在所有函數(shù)之,函數(shù)main( )之前。但其實(shí)它可以放置在任何第一次被使用之前的地方,只要不在函數(shù)內(nèi)就可以。實(shí)踐表明,定義全局
    變量的位置是在程序的頂部。
    [例4 - 7 ]
    int count; /*count 是全局變量* /
    main( )
    {
     count = 100;