1樓:匿名使用者
首先,要知道作用域的概念。c有**塊作用域,檔案作用域和函式原型作用域。詳細內容書裡面可以講一章,涉及到鏈結型別,作用域,儲存時期。這裡只說一點,你可能比較關心,看下面這個例子
#include
char *a = "global";
void global()
void local()
int main()
global()將輸出"a = global",local()將輸出"a = local"
原因簡單來說,就是內部**塊作用域({}之間的內容)的宣告和定義會覆蓋掉外部宣告和定義
在local()中,重新宣告和初始化了a,再列印的時候,會把全域性變數a的值覆蓋掉
而在global()中,沒有重新宣告,因此編譯器會使用外部定義的a的值
回到你的例子
#include
int square(int i)
int main()
printf("%d\n",i);
return 0;
}在for後面小括號的內容,沒有新的i的宣告,也沒有進入{},不會被裡面對i新的定義覆蓋,依然用外部i的值,因此從0開始,2結束。static int i=1;這句話會在for下面的{}作用域覆蓋掉外部i的定義。有一點,靜態變數具有靜態儲存時期,放在全域性/j靜態變數區而非棧區,計算機會一直儲存他的值到下一次呼叫。
但是for結束後,外部i的定義又會回恢復作用,結束時i=2。
2樓:解放宣言
靜態變數的值是持久的(絕對的持久,生命週期跟全域性變數一樣),初始化的操作實際上是在第一次執行到宣告語句的時候進行的。如果寫個c++的程式,static裡面填乙個類觀察下構造器的執行時機就能看出來,c應該是類似的。
這個的生命週期和作用域是不一樣的,作用域是區域性的,但是有永久的生存週期。
c語言for迴圈裡,static變數也能儲存值嗎?為什麼?
3樓:凌雨歿
在迴圈體內和在函式內的static變數都是靜態區域性變數。
靜態區域性變數有以下特點:
1.該變數在全域性資料區分配記憶體;
2.靜態區域性變數在程式執行到該物件的宣告處時被首次初始化,即以後的函式呼叫不再進行初始化;
3.靜態區域性變數一般在宣告處初始化,如果沒有顯式初始化,會被程式自動初始化為0;
4.它始終駐留在全域性資料區,直到程式執行結束。但其作用域為區域性作用域,當定義它的函式或語句塊結束時,其作用域隨之結束;
所以,在for迴圈類的static變數在下一次進入迴圈的時候,值是儲存了的,為你上一次退出迴圈時候的值
4樓:
因為static的變數是放在靜態儲存區,和全域性變數像似,只是作用域不同。
c 靜態變數問題,很奇怪
其實,這裡主要是要搞清楚輸出的順序。對於cout 來說,是從右往左依次把結果壓入緩衝區,最後再整體輸出出來。也就是說,先計算add j 此時結果為2,n 2,再計算add i 此時結果為3,n 3。所以輸出的結果為3 2。當執行cout 的時候,先計算add i 此時結果為1,n 1 再計算add ...
迴圈中完成多次輸入輸出c語言求教啊
include int main return 0 參考一樓,但是 float m,a,i,c,x 這裡將a去掉,應為你這裡定義了,後面沒有用,沒有初始化,所以會出錯! 愛我所愛 include int main return 0 int main 名字應該用字元陣列或字串型別,其他的要實現迴圈輸入...
c語言標頭檔案包含 全域性變數使用問題
c語言在標頭檔案中包含全域性變數有三種形式 1 在標頭檔案中宣告乙個全域性變數,在乙個c檔案中定義全域性變數,然後在所有的引用了這個標頭檔案的c檔案裡都可以使用該全域性變數值。如在main.c定義 int a 3 然後定義乙個main.h,那麼所有引用main.h的c檔案中,均可以訪問a並更改其值。...