2010-12-01 65 views
5

簡單的問題。想象一下在ANSI-C中:For循環計數器停留嗎?

int i; 

for(i=0 ; i<5 ; i++){ 
    //Something... 
} 

printf("i is %d\n", i); 

這個輸出是「我是5」嗎?

是否i保留或是否爲i循環後未定義的值?

回答

14

是的。如果我在for循環之外聲明,它將在循環結束後保留​​在範圍內。它保留了它在退出循環時所具有的任何價值。

如果declatred我在循環:

for (int i = 0 ; i < 5 ; i++) 
{ 

} 

然後我在循環退出後不確定。

1

變量i被定義在循環範圍之外(這很好,或者在這種情況下您將無法打印它)。

而且它對循環的每一回合都進行了後處理,對於這種情況,當我大於或等於5時結束條件爲「停止」。

因此,在這一點上,我等於5是非常合理的。

塊作用域與C中的函數作用域不完全相同。當您離開循環的作用域時,變量i不會「神奇地回到」以前的值。

1

i你的循環後的值將爲5。除非你做了類似

i = 50000; 

它裏面。

0

通常還建議不要在我讀過的大多數編碼標準中退出循環後使用「i」。尤其是不要做:

for(i = 0; i < num_elements; i++) 
{ 
    if(element[i].id == id) 
    { 
     /* Do something to element here. */ 
     break; 
    } 
} 

if(i == num_elements) 
{ 
    fprintf(stderr, "Failed to find element %d.", id); 
    succeeded == false; 
} 

雖然這工作,它是編碼很差。它的可讀性和可維護性都比其他方案低。例如。

succeeded = false; 

for(i = 0; i < num_elements; i++) 
{ 
    if(element[i].id == id) 
    { 
     /* Do something to element here. */ 
     succeeded = true; 
     break; 
    } 
} 

if(false == succeeded) 
{ 
    fprintf(stderr, "Failed to find element %d.", id); 
} 
0

是的,變量只在聲明它們的塊內有效。 下面是一個例子:

#include <stdio.h> 

void main(int argc, char *argv[]) 
{ 
    if(argc == 2) { 
     int x; 
     x = 7; 
    } 

    x = 1; 
} 

這是編譯器:

gcc ex.c 
ex.c: In function ‘main’: 
ex.c:10: error: ‘x’ undeclared (first use in this function) 
ex.c:10: error: (Each undeclared identifier is reported only once 
ex.c:10: error: for each function it appears in.) 
+0

錯誤,是什麼?他問:「是A還是B?」。只有「是」或「否」才能令人滿意地回答這樣的問題。他還在街區之外宣佈了他的變數。我沒有找到相關的或必要的答案(因爲它沒有添加以前答案中沒有的新信息)。 – AlastairG 2010-12-01 15:18:10