二、變量存儲類型
前面我們說了,聲明變量時用如下類似的形式:
int num;
float total;
它們都沒有存儲類型修飾符,我們在聲明時也可以通過存儲類型修飾符來告訴編譯器將要處理什么類型的變量。存儲類型有以下四種:自動(auto)、靜態(tài)(static)、外部(extern)、寄存器(regiser)。
1.自動存儲類型
自動存儲類型修飾符指定了一個局部變量為自動的,這意味著,每次執(zhí)行到定義該變量的語句塊時,都將會為該變量在內(nèi)存中產(chǎn)生一個新的拷貝,并對其進行初始化。實際上,如果不特別指明,局部變量的存儲類型就默認為自動的,因此,加不加auto都可以。
main()
{
auto int num=5;
printf(%d\n,num);
}
在這個例子中,不論變量num的聲明是否包含關(guān)鍵字auto,代碼的執(zhí)行效果都是一樣的。函數(shù)的形式參數(shù)存儲類型默認也是自動的。
2.靜態(tài)存儲變量
前面已經(jīng)使用了static關(guān)鍵字,但是對于局部變量,靜態(tài)存儲類型的意義是不一樣的,這時,它是和自動存儲類型相對而言的。靜態(tài)局部變量的作用域仍然近局限于聲明它的語句塊中,但是在語句塊執(zhí)行期間,變量將始終保持它的值。而且,初始化值只在語句塊第一次執(zhí)行是起作用。在隨后的運行過程中,變量將保持語句塊上一次執(zhí)行時的值。看下面兩個對應(yīng)的程序:
/*1.C*/ /*2.C*/
int add(); int add();
main() main()
{ {
int result; int result;
result=add() result=add();
printf(%d ,result); printf(%d ,result);
result=add(); result=add();
printf(%d ,result); printf(%d ,result);
result=add(); result=add();
printf(%d,result); printf(%d,result);
} }
int add() int add()
{ {
int num=50; static int num=50;
num++; num++;
return num; return num;
} }
上面兩個源文件,只有函數(shù)add()里的變量聲明有所不同,一個是自動存儲類型,一個是靜態(tài)存儲類型。
對于1.C文件,輸出結(jié)果為51 51 51;這很好理解,每次初始值都是50,然后加1上來。
對于2.C文件,輸出結(jié)果為51 52 53;這是由于變量是靜態(tài)的,只在第一次初始化了50,以后都是使用上次的結(jié)果值。當?shù)谝淮握{(diào)用add()時,初始化為50,然后加1,輸出為51;當?shù)诙握{(diào)用時,就不初始化了,這時num的值為上次的51,然后加1,輸出52;當?shù)谌握{(diào)用時,num為52,加1就是53了。
相關(guān)推薦:計算機等級考試二級C語言教程匯總北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內(nèi)蒙古 |