简单问题。想象一下这在ANSI-C中:
int i;
for(i=0 ; i<5 ; i++){
//Something...
}
printf("i is %d\n", i);
这输出“我是5”吗?
循环后保留i
或i
的值是否未定义?
答案 0 :(得分:14)
是。如果i在for循环之外声明,它将在循环退出后保持在范围内。它保留了循环退出时的任何值。
如果你在循环中声明我:
for (int i = 0 ; i < 5 ; i++)
{
}
然后在循环退出后我未定义。
答案 1 :(得分:1)
变量i是在循环范围之外定义的(这很好,或者在这种情况下你无法打印它)。
对于循环的每一个回合都是后期修改,结束条件是“当我大于或等于5时停止”。
因此,在这一点上我等于5真的很有意义。
块范围与C中的函数范围不完全相同。当您退出循环范围时,变量i不会神奇地“返回”它的先前值。
答案 2 :(得分:1)
i
的值为5。除非你做了像
i = 50000;
里面。
答案 3 :(得分: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;
}
虽然这样可行但编码很差。它的可读性和可维护性低于其他选择。 E.g。
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);
}
答案 4 :(得分: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.)