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

考虑这个C代码:

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

在这里,我几乎可以在任何地方放置分号。 只是为了好玩 。 但令人惊讶的是它奏效了 ! 我收到了关于分号后分号的警告,但其他绝对错误的分号也起作用了。 如果我在放置后忘了放一个分号,我会收到以下错误

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


为什么没有大量错误和无用的分号会导致错误? 在我看来,他们应该被视为语法错误。

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

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

C11 6.8.3表达式和空语句

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


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

 #include ; 

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

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

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

如果你不放置delimeter,那么它会考虑当前语句的下一个语句并执行。 这给出了一个合成错误。

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

int a;;;;;

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

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

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

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

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

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