#include <stdio.h>
int main()
{
int sub[50], i;
for(i=0;i<=48;i++);
{
sub[i]=i;
printf("%d\n",sub[i]);
}
return 0;
}
我最初期望不会显示任何输出,因为控制流将在遇到分号后退出 for 循环,然后当我知道循环将执行一次,因为它首先读取初始化部分然后读取条件,然后读取循环语句然后更新。
整个循环运行,当
i
不再小于或等于48时终止。由于每次递增1,因此该值为49.
for(i=0;i<=48;i++);
此循环完成后,运行程序的其余部分:
{
sub[i]=i;
printf("%d\n",sub[i]);
}
这导致
sub[49]
接收到值 49,然后由 printf
语句输出。
问题出在循环后的分号处:
i++);
去掉它。
这个for循环
for(i=0;i<=48;i++);
被执行直到
i
等于 49
。在这种情况下,循环 i<=48
的条件将评估为 false.
所以在循环之后变量
i
等于49
并且它在for循环后面的这个复合语句中输出
{
sub[i]=i;
printf("%d\n",sub[i]);
}
注意数组的所有元素
sub
int sub[50], i;
除了索引为
49
.的元素外保持未初始化
为了清楚起见,可以使用 while 循环而不是 for 循环按以下方式等效地重写您的程序。
#include <stdio.h>
int main( void )
{
int sub[50], i;
i = 0;
while ( i <= 48 ) i++;
sub[i] = i;
printf( "%d\n",sub[i] );
return 0;
}
在循环后封闭两个语句 like
{
sub[i] = i;
printf( "%d\n",sub[i] );
}
不改变程序的逻辑。
for
语句for(i=0;i<=48;i++);
有一个尾随;
,这是一个空体。因此,循环只是将 i
增加到它的最终值 49
。接下来的块只执行一次,i
,49
的最终值存储到sub[49]
并打印。
这里有 3 种方法可以避免这个愚蠢的错误:
{
写在 for
行的末尾,使得 for(i=0;i<=48;i++); {
不太可能被写出来并且更容易被发现。i
在 for
语句的初始子句中,它将此变量的范围限制在 for
语句中,因此会使您的代码无法编译。这里是修改版:
#include <stdio.h>
int main() {
int sub[50];
for (int i = 0; i < 49; i++) {
sub[i] = i;
printf("%d\n", sub[i]);
}
return 0;
}
还请注意,
sub
有 50 个元素,其中只有 49 个元素被这个循环初始化。使用<
运算符代替<=
允许使用数组长度作为循环的上边界,这也是迭代次数。