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