为什么你在C中使用多个分号?

Eiy*_*uyf 10 c

在CI中可以执行以下操作:

int main()
{
 printf("HELLO WORLD");;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
}
Run Code Online (Sandbox Code Playgroud)

它的工作原理!这是为什么?

我的个人想法:分号是一个NO OPERATION(来自维基百科)指标,有一个巨大的字符串就像有一个并告诉C声明已经结束一样.

Jer*_*fin 9

C允许空语句.它们可用于空循环之类的东西:

while (*d++ = *s++)
   ; // null statement.
Run Code Online (Sandbox Code Playgroud)

你刚刚创建了一系列它们.

它还允许不完全空的语句,如:

0;
1+1;
Run Code Online (Sandbox Code Playgroud)

这两个都包含表达式,但没有副作用,因此它们并没有真正做任何事情.他们被允许,尽管编译器可能会对它们发出警告.

一个不错的编译器通常不会为上述任何一个生成任何代码(大多数甚至不会关闭优化,我无法想象一个优化开启的代码).


Ton*_*roy 9

分号终止一个语句......连续的分号代表无操作语句(如你所说).考虑:

while (x[i++] = y[j++])
    ;
Run Code Online (Sandbox Code Playgroud)

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

为什么?

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

 MY_MACRO1();
 MY_MACRO2();
Run Code Online (Sandbox Code Playgroud)

...预处理器只能替换MY_MACROX()文本,并在可能在空语句之后留下尾随分号.如果编译器拒绝这一点,那么使用预处理器就会困难得多,或者预处理器调用不像非预处理器函数调用(它们必须在替换中输出分号,并且调用者必须避免使用尾随分号当使用它们时 - 这将使实现更难以无法用巧妙的宏替代性能,调试和定制目的的函数.


Mar*_*som 8

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

  • 对于学究者:是的,你无疑是正确的:`for(;;)`一起包含两个分号,但不是空语句. (3认同)