你能解释一下这段代码的输出是 49 吗[关闭]

问题描述 投票:0回答:4
#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 循环,然后当我知道循环将执行一次,因为它首先读取初始化部分然后读取条件,然后读取循环语句然后更新。

arrays c for-loop printf stdio
4个回答
1
投票

整个循环运行,当

i
不再小于或等于48时终止。由于每次递增1,因此该值为49.

for(i=0;i<=48;i++);

此循环完成后,运行程序的其余部分:

{
    sub[i]=i;
    printf("%d\n",sub[i]);
}

这导致

sub[49]
接收到值 49,然后由
printf
语句输出。


0
投票

问题出在循环后的分号处:

i++);
去掉它。


0
投票

这个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] );
}

不改变程序的逻辑。


0
投票

for
语句
for(i=0;i<=48;i++);
有一个尾随
;
,这是一个空体。因此,循环只是将
i
增加到它的最终值
49
。接下来的块只执行一次,
i
49
的最终值存储到
sub[49]
并打印。

这里有 3 种方法可以避免这个愚蠢的错误:

  • 编译时启用编译器的所有警告,以指出可能的程序员错误,例如这个错误。
  • 使用经典的 K&R 括号样式,其中
    {
    写在
    for
    行的末尾,使得
    for(i=0;i<=48;i++); {
    不太可能被写出来并且更容易被发现。
  • define
    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 个元素被这个循环初始化。使用
<
运算符代替
<=
允许使用数组长度作为循环的上边界,这也是迭代次数。

© www.soinside.com 2019 - 2024. All rights reserved.