为什么没有分号会出错,但是有太多分号没有?

问题描述 投票:3回答:5

考虑这个C代码:

#include <stdio.h>;

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

在这里,我几乎可以在任何地方放置分号。纯娱乐。但令人惊讶的是it worked!我收到了关于分号后分号的警告,但其他绝对错误的分号也起作用了。如果我忘记在puts之后加一个分号,我将收到以下错误

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


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

c syntax
5个回答
10
投票

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

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

C11 6.8.3表达式和空语句

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


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

#include <stdio.h>;

5
投票

分号表示语句的结尾是否为空。没有分号意味着你没有关闭/结束最后一个语句但是启动了一个给出错误的新语句。分号过多表示每个空白语句结束。所以,它不会给出错误


1
投票

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


0
投票

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

如果你没有放置分隔符,那么它会考虑当前语句的下一个语句并执行。这会产生语法错误。

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

int a;;;;;

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

查看此问题的一些有趣案例:

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

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

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

0
投票

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

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