C:为什么额外的分号可以吗?

时间:2016-08-10 10:23:45

标签: c

#include <stdio.h>

int main() {
    int a = -1, b = -10, c = 5;
    if (a > b)
        printf("Hello World");
    else
        printf("Get out World");;;;;;
}

有人能告诉我为什么第8行仍然有效,有多个分号吗?

7 个答案:

答案 0 :(得分:6)

空语句在C中是合法的。由于;语句终止符,因此多个;在语法上有效。有时这甚至是有用的:例如for (;;) {/*code here*/}成语。

(虽然有些编译器会在适当的情况下警告你。)

请注意,至少从概念上讲,该行中多余的; 是<{1}}块的一部分。

答案 1 :(得分:6)

您的程序在main函数末尾只有一系列空语句。它被解析为:

#include <stdio.h>

int main() {
    int a = -1, b = -10, c = 5;

    if (a > b)
        printf("Hello World");
    else
        printf("Get out World");
    ;
    ;
    ;
    ;
    ;
}

请注意,int main()应写为int main(void),并且应返回int值,例如0。 C99隐含了这个return 0;,但它被认为是不好的样式,省略它的确便宜。

答案 2 :(得分:3)

一般来说,分号不是“OK”。

例如,稍微更改您的代码:

#include <stdio.h>

int main() {
    int a = -1, b = -10, c = 5;
    if (a > b)
        printf("Hello World");;;;;;
    else
        printf("Get out World");
}

甚至不会编译。

另一个例子,这个编译确实:

   ...

   int done = 0;

   ...

   while ( !done );
   {
       ...

       done = 1;
   }

   ...

答案 3 :(得分:2)

;;;;;是空的陈述。他们被允许进入C.

答案 4 :(得分:2)

这是一个 null语句,它在printf()语句后面。允许有多个分号。

C11,§6.8.3,4

  

null语句(仅由分号组成)执行no   操作

答案 5 :(得分:2)

嗯,C中的;分号是一个语句终止符,这意味着你不能把它放在你喜欢的地方,只能在一个语句的末尾

null语句(无效的语句)在C中有效,允许您按照发布的内容编写内容,例如:

while((data = do_read(...)) != NULL); /* skip input until EOF */

应该更加明显地写为(单个分号太小而不能在快速阅读中跳过):

while((data = do_read(...)) != NULL) continue;

看起来更好,因为你永远不会认为下一行是在循环内。

顺便说一下,如果你写的东西是:

if (a > b); /* <====== LOOK at this semicolon */
    printf("Hello World");;;;;;
else
    printf("Get out World");

它不会编译,因为这意味着如果大于b只是什么都不做并且这是C中的一个好的有效句子。相比之下,当编译器出现几行时会出现错误获取else令牌并且无法将其与if语句匹配(请记住,当您使用;时,您已完成if声明)

printf("Hello World");语句之后放置的分号组也会发生这种情况(第一个分号终止它,并且下一个标记不是else而是{{1} },也终止;语句。

上例中的陈述是:

if

这里,当你从编译器得到一个语法错误时,你不能有一个好的C程序,所以你不会得到进一步的分析(编译器试图恢复并继续解析超过这一点,但你可能有新的错误来源新条件,或假错误

答案 6 :(得分:0)

正如我们所知,分号(;)用作语句终止符。在第8行中,第一个分号终止else下的语句,下一个分号终止空语句,依此类推。