【问题标题】:Why no semicolon gives errors but too many of them don't?为什么没有分号给出错误但太多的分号没有?
【发布时间】:2015-05-16 18:18:27
【问题描述】:

考虑这个 C 代码:

#include <stdio.h>;

int main(void) {
    puts("Hello, world!");; ;
    ;
    return 0; ;
    ; ;
};

在这里,我几乎在所有可能的地方都放置了分号。只是为了乐趣。但令人惊讶的是it worked!我在包含后收到关于分号的警告,但其他绝对错误的分号起作用了。如果我忘记在puts 后面加分号,我会收到以下错误

错误:预期为 ';'在'返回'之前


为什么很多错误和无用的分号不会导致错误?在我看来,它们应该被视为语法错误。

【问题讨论】:

    标签: c syntax


    【解决方案1】:

    一个分号构成一个空语句。它不仅合法,在某些情况下也很有用,例如,不需要实体的 while/ for 循环。一个例子:

    while (*s++ = *t++)
        ;
    

    C11 6.8.3 表达式和空语句

    空语句(仅由分号组成)不执行任何操作。


    唯一的语法错误是这一行:

    #include <stdio.h>;
    

    【讨论】:

    • 那么如果include后面的分号出错了怎么编译呢?
    • @ForceBru 没有警告吗?
    • 是的,当然,但这是一个警告,而不是错误,不是吗?所以,它只是被弃用了,但没关系。
    • @ForceBru 警告并不意味着它被弃用。我会说这更像是一个小错误,不是致命的,但诊断消息是必要的。
    • @ForceBru ; 将在预处理器解析包含后保留,因此它取决于包含的源包含的内容,它可能会将源更改为无效或只是另一个 null声明。
    【解决方案2】:

    分号表示语句的结束,无论它是否为空。没有分号意味着您还没有关闭/结束最后一条语句,而是开始了一个新的语句,它给出了错误。太多的分号表示每个空白语句的结尾。所以,它不会给出错误

    【讨论】:

      【解决方案3】:

      为什么空语句应该是错误的?不是。

      【讨论】:

        【解决方案4】:

        ;(语句分隔符)始终用于指定特定语句结束。在执行下一条语句之后。

        如果你不放分隔符,那么它会以当前语句考虑下一条语句并执行。这会导致语法错误。

        但在其他情况下,当我们放置多个分隔符时,例如:

        int a;;;;;

        在这种情况下,我们有 5 个语句,其中int a 是第一个语句,接下来的四个语句是空语句,编译器将在编译期间删除它们。

        查看这个问题的一些有趣案例

        int main()
        {
            int a=0 ;,;
            return 0;
        }
        

        当我们改变上面的程序时它仍然有效:

        int main()
        {
            int a=0 ,; /*change done*/
            return 0;
        }
        

        【讨论】:

          【解决方案5】:

          ; 是 C 中的语句分隔符,如上述答案中所述。 Rahul 的回答是完全正确的,只是您可以看到this 对一个问题的回答,该问题询问为什么 C 中的语句以分号结尾。因此,当您了解为什么使用分号时,您就会明白如果分号过多会发生什么。

          【讨论】:

            猜你喜欢
            • 2020-11-29
            • 2015-01-04
            • 1970-01-01
            • 1970-01-01
            • 2018-06-02
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-05-15
            相关资源
            最近更新 更多