首页 > 解决方案 > 使用 ”;” 在 for 语句的末尾,但代码仍在执行

问题描述

#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;
}

为什么输出是49

我认为它不应该执行该printf功能。

标签: cloopsfor-loopscope

解决方案


你的程序有一个典型的错误:for语句行以 a 结尾;,导致for有一个空的主体和下面的块无条件地执行一次,i并且在循环结束时具有最终值,即49

语句在thefor处结束,;下一{行的 the 开始一个单独的块,与语句无关for,无条件执行。

所以你的程序相当于:

#include <stdio.h>

int main()
{
    int sub[50], i;

    for (i = 0; i <= 48; i++); // the compiler will simplify this to i = 49

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

    return 0;
}

我不知道您是不是;故意添加的,但如果您不小心添加了,请注意经典的 K&R 样式使此类错误的可能性大大降低:

#include <stdio.h>

int main() {
    int sub[50], i;
    //for (i = 0; i <= 48; i++); {  // <--- this would immediately catch your eye!
    for (i = 0; i <= 48; i++) {
        sub[i] = i;
        printf("%d\n", sub[i]);
    }
    return 0;
}

使用 c99 新for语法,您将ifor初始子句中定义,编译器会发现错误:

#include <stdio.h>

int main()
{
    int sub[50];
    for (int i = 0; i <= 48; i++);
    {
        sub[i] = i;   //<--- error: `i` is not defined anymore
        printf("%d\n", sub[i]);
    }
    return 0;
}

;故意在行尾仅尾随创建空循环for()是令人困惑且容易出错的。如果配置为更高的警告级别,编译器可能会用警告标记这一点,顺便说一句,这是检测愚蠢错误的非常好的做法(即:gcc -Wall -Werrorclang -Weverything -Werror)。

如果你想要一个空的身体,我会推荐这种语法:

/* find the last node of the list */
if (list) {
    for (cur = list; cur->next; cur = cur->next)
        continue;
    //...
}

推荐阅读