2010-04-01 65 views
0

包括
main() 
{ 
    int a; 
    for(a=1; a<=4 && printf("%d ",a); a++) 
    { 
     int a; 
     static int b=a; 
     printf("%d ",(a++)-b); 
    } 
    getchar(); 
    getchar(); 
} 

在該代碼時,打印輸出是1 0 2 1 3 2 4 3我明白爲什麼INT一個;部分的工作方式與在for函數之外定義的int a不同,爲什麼static int b;只是定義了一次,主值爲a;但爲什麼printf中的(a ++)部分會影響一個?難道我們不重新定義一個int;每次for函數運行?提前致謝。關於產品在功能變量定義

+0

需要'家庭作業'標籤嗎? – 2010-04-01 20:08:57

+0

@ all-editors:太多的時候編輯不好;) – 2010-04-01 20:13:04

+0

這不是家庭作業。我爲全國比賽學習C謎題。 – 2010-04-01 20:13:42

回答

3

內部'a'變量未初始化,所以它的值在技術上每次通過循環都未定義。

+0

我知道它是未初始化的,但是我看到a的未初始化值隨着printf函數中++的增加而增加。這是因爲我的編譯器還是使用C++語言才能夠更改「未初始化」值? – 2010-04-01 20:18:11

+0

請看James的回答。這完全正確。 – JayM 2010-04-01 21:47:07

3

您不會爲內部a分配值,因此結果未定義。

即使你改變你的代碼分配的東西a,你的代碼無法編譯,因爲你試圖給一個變量分配給本地靜態在這條線:

static int b=a; 

編譯器輸出:

test.c: In function `main': 
test.c:9: error: initializer element is not constant 
+0

哇,我甚至沒有意識到這在C中是無效的。即使只使用C風格編碼,還有一個使用C++的理由。 – 2010-04-02 02:01:39

4

inner a是未定義的,因此編譯器可以使用它喜歡的任何值。它喜歡的值顯然是字節「a」佔據的當前值。通過循環第二次,你會得到一個全新的inner-a,它恰好與前一個inner-A位於相同的位置,並且假定它是有價值的。

但是,這只是巧合 - 如果以其他方式更容易做到這一點,編譯器會(併合法地)。

還要注意,a的值在第二個a ++之後永遠不會被讀取。如果你打開優化,編譯器很可能會認爲它不需要做這個增量,而a的內部值總是爲零。