#include <stdio.h>
int main() {
int a = -1, b = -10, c = 5;
if (a > b)
printf("Hello World");
else
printf("Get out World");;;;;;
}
有人能告诉我为什么第8行仍然有效,有多个分号吗?
答案 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
下的语句,下一个分号终止空语句,依此类推。