简单的问题。想象一下在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