我橫跨這片C代碼傳來:多個實例
main(){
static int i=0;
i++;
if(i<=5){
int i = 3;
printf(" %d",i);
main();
}
}
1.首先,我期望將該代碼作爲有多個給編譯錯誤變量的定義i
。但是,它編譯併成功運行並提供了此輸出。
3 3 3 3 3
2.觀察輸出,恰好印刷5倍,這意味着循環從0-5因此暗示計數,對於如果條件,第一定義(靜態)使用i
。
然而,正在打印的值是3 這是i
的第二定義。
所以變量標籤i
指的是內存中的兩個不同實例。一個用作循環計數,執行增量操作,另一個用於打印值。
我能以某種方式解釋這個問題的唯一辦法是:
int i = 3
(第二定義),在每一個遞歸調用重複。i
的實例是在函數被調用時創建的,並且在下一次遞歸調用時被終止。 (由於靜態範圍)。printf
使用這個實例,因爲它是最新的定義(?)當進入遞歸的一個新的水平,
i++
正在做。由於沒有其他方法可以解決此問題,因此它使用i
的靜態「實例」,該靜態「實例」在代碼中仍處於「活動」狀態,因爲它被定義爲靜態。
但是,我無法精確地指出這是如何工作的......任何人都可以解釋這裏發生了什麼,在代碼和內存中?
這裏的編譯器如何完成變量綁定?
一個字:範圍。 – devnull
閱讀[可變陰影](http://en.wikipedia.org/wiki/Variable_shadowing)。 –
你沒有'while'環... – starsplusplus