例3.6.作用域
print_time
打印的是全局變量的值,第二次直接調(diào)用
printf
打印的則是
main
函數(shù)局部變量的值。
main
函數(shù)是蓋在這張大紙上的一張小紙,也就是
main
函數(shù)局部變量的作用域。在小紙上用到標(biāo)識符
hour
和
minute
時應(yīng)該參考小紙上的定義,因為大紙(全局變量的作用域)被蓋住了,如果在小紙上用到某個標(biāo)識符卻沒有找到它的定義,那么再去翻看下面的大紙上有沒有定義,例如上圖中的變量
x
。
局部變量可以用類型相符的任意表達(dá)式來初始化,而全局變量只能用常量表達(dá)式(Constant Expression)初始化
。例如,全局變量
pi
這樣初始化是合法的:
double pi = 3.14 + 0.0016;
但這樣初始化是不合法的:
double pi = acos(-1.0);
然而局部變量這樣初始化卻是可以的。程序開始運(yùn)行時要用適當(dāng)?shù)闹祦沓跏蓟肿兞浚猿跏贾当仨毐4嬖诰幾g生成的可執(zhí)行文件中,因此初始值在
編譯時
就要計算出來,然而上面第二種Initializer的值必須在程序
運(yùn)行時
調(diào)用
acos
函數(shù)才能得到,所以不能用來初始化全局變量。請注意區(qū)分編譯時和運(yùn)行時這兩個概念。為了簡化編譯器的實現(xiàn),C語言從語法上規(guī)定全局變量只能用常量表達(dá)式來初始化,因此下面這種全局變量初始化是不合法的:
int minute = 360;int hour = minute / 60;
雖然在編譯時計算出
hour
的初始值是可能的,但是
minute / 60
不是常量表達(dá)式,不符合語法規(guī)定,所以編譯器不必想辦法去算這個初始值。
如果全局變量在定義時不初始化則初始值是0,如果局部變量在定義時不初始化則初始值是不確定的。所以, 局部變量在使用之前一定要先賦值 ,如果基于一個不確定的值做后續(xù)計算肯定會引入Bug。
例3.7.驗證局部變量存儲空間的分配和釋放
#include <stdio.h> void foo(void) { int i; printf("%d\n", i); i = 777; } int main(void) { foo(); foo(); return 0; }
結(jié)果是:
134518128 777
int main(void) { foo(); printf("hello\n"); foo(); return 0; }
結(jié)果是:
134518200 hello 0
非定義的函數(shù)聲明也可以寫在局部作用域中,例如:
int main(void) { void print_time(int, int); print_time(23, 59); return 0; }
這樣聲明的標(biāo)識符
print_time
具有局部作用域,只在
main
函數(shù)中是有效的函數(shù)名,出了
main
函數(shù)就不存在
print_time
這個標(biāo)識符了。
雖然在一個函數(shù)體中可以聲明另一個函數(shù),但不能定義另一個函數(shù),C語言不允許嵌套定義函數(shù)。
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
