簡單的問題。想象一下在ANSI-C中:For循環計數器停留嗎?
int i;
for(i=0 ; i<5 ; i++){
//Something...
}
printf("i is %d\n", i);
這個輸出是「我是5」嗎?
是否i
保留或是否爲i
循環後未定義的值?
簡單的問題。想象一下在ANSI-C中:For循環計數器停留嗎?
int i;
for(i=0 ; i<5 ; i++){
//Something...
}
printf("i is %d\n", i);
這個輸出是「我是5」嗎?
是否i
保留或是否爲i
循環後未定義的值?
是的。如果我在for循環之外聲明,它將在循環結束後保留在範圍內。它保留了它在退出循環時所具有的任何價值。
如果declatred我在循環:
for (int i = 0 ; i < 5 ; i++)
{
}
然後我在循環退出後不確定。
變量i被定義在循環範圍之外(這很好,或者在這種情況下您將無法打印它)。
而且它對循環的每一回合都進行了後處理,對於這種情況,當我大於或等於5時結束條件爲「停止」。
因此,在這一點上,我等於5是非常合理的。
塊作用域與C中的函數作用域不完全相同。當您離開循環的作用域時,變量i不會「神奇地回到」以前的值。
i
你的循環後的值將爲5。除非你做了類似
i = 50000;
它裏面。
通常還建議不要在我讀過的大多數編碼標準中退出循環後使用「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);
}
是的,變量只在聲明它們的塊內有效。 下面是一個例子:
#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.)
錯誤,是什麼?他問:「是A還是B?」。只有「是」或「否」才能令人滿意地回答這樣的問題。他還在街區之外宣佈了他的變數。我沒有找到相關的或必要的答案(因爲它沒有添加以前答案中沒有的新信息)。 – AlastairG 2010-12-01 15:18:10