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