【发布时间】:2011-05-18 11:00:00
【问题描述】:
简单的问题。在 ANSI-C 中想象一下:
int i;
for(i=0 ; i<5 ; i++){
//Something...
}
printf("i is %d\n", i);
这会输出“i is 5”吗?
是i 保留还是循环后i 的值未定义?
【问题讨论】:
简单的问题。在 ANSI-C 中想象一下:
int i;
for(i=0 ; i<5 ; i++){
//Something...
}
printf("i is %d\n", i);
这会输出“i is 5”吗?
是i 保留还是循环后i 的值未定义?
【问题讨论】:
是的。如果 i 在 for 循环之外声明,则在循环退出后它仍然在范围内。它保留循环退出时的任何值。
如果你在循环中声明了 I:
for (int i = 0 ; i < 5 ; i++)
{
}
然后循环退出后 i 未定义。
【讨论】:
变量 i 是在循环范围之外定义的(这很好,否则在这种情况下您将无法打印它)。
并且它在循环的每一轮都被后置,其结束条件是“当 i 大于或等于 5 时停止”。
所以此时 i 等于 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.)
【讨论】: