11

在 CI 中可以做到以下几点:

int main()
{
 printf("HELLO WORLD");;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
}

它有效!这是为什么?

我个人的想法:分号是一个 NO OPERATION(来自维基百科)指示符,拥有一个巨大的字符串与拥有一个并告诉 C 语句已经结束的想法相同。

4

5 回答 5

11

分号终止语句......连续的分号表示无操作语句(如您所说)。考虑:

while (x[i++] = y[j++])
    ;

在这里,所有的工作都是在循环测试条件下完成的,所以需要一个空语句。但是,即使没有控制循环,也允许空语句。

为什么?

好吧,预处理器的许多用途可能会扩展到一些实际的 C 代码,或者根据一些早期的定义被删除,但是给定......

 MY_MACRO1();
 MY_MACRO2();

...预处理器只能替换MY_MACROX()文本,将尾随分号留在那里,可能在空语句之后。如果编译器拒绝了这个,那么使用预处理器会更加困难,或者预处理器调用不像非预处理器函数调用(它们必须在替换中输出分号,并且调用者必须避免尾随分号使用它们时)——这将使实现更难无缝地用聪明的宏代替函数来实现性能、调试和定制目的。

于 2012-06-04T05:52:13.570 回答
9

C 允许空语句。它们对于空循环之类的东西很有用:

while (*d++ = *s++)
   ; // null statement.

您刚刚创建了一系列。

它还允许非完全空语句,例如:

0;
1+1;

这两个都包含表达式,但没有副作用,因此它们实际上并没有做任何事情。它们是允许的,尽管编译器可能会警告它们。

一个体面的编译器通常不会为上述任何内容生成任何代码(大多数即使关闭优化也不会生成,我无法想象打开优化的编译器会这样)。

于 2012-06-04T05:49:20.373 回答
8

两个分号一起构成一个空语句。C 不介意有空语句——它们不生成任何代码。

于 2012-06-04T05:47:30.257 回答
3

因为分号标识 C 中语句的结尾,而在您的情况下,更多分号标识更多空语句……没有错,它们只是空语句。

于 2012-06-04T05:48:44.020 回答
0

分号是行终止符,意思是它们告诉代码已经到达行尾,然后,执行下一行代码。

一个证据是您可以在一行中编写代码,不包括指令。

main() { cout << "ENTER TWO NUMBERS"; cin >> a; cin >> b; cout << "The sum of two numbers are" << a+b; << return 0;}

这可能意味着 main() { cout << "ENTER TWO NUMBERS"[THEN] cin >> a[THEN] cin >> b[THEN] cout << "The sum of two numbers are" << a+b[THEN ] << 返回 0[然后]}

所以如果你要放置多个分号,就像一个 THEN, THEN, THEN, THEN,你个人的想法确实是正确的。

于 2012-06-04T05:55:47.023 回答