c - 为什么可以在 C 中使用多个分号?

标签 c

在 C 中,我可以执行以下操作:

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

而且有效!这是为什么?

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

最佳答案

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

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

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

为什么?

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

 MY_MACRO1();
 MY_MACRO2();

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

关于c - 为什么可以在 C 中使用多个分号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10876776/

相关文章:

c - 在 C 程序中为 jemalloc 设置 MALLOC_CONF 环境变量不起作用

c - 子进程是否也应该解锁被阻塞的 SIGCHLD 信号?

c - 如果 gets() 可以接受 char 数组,为什么它不接受 char 指针参数?

c - 将结构体写入文件中,C

c - ANSI C 中的简单延迟关闭应用程序,开关也表现得很奇怪

c - 如何从二进制文件中删除前n个字符

CUDA C 代码上的 C++ 关键字

c - 如何修复此 pthread_create 类型错误?

c - 为什么编译器看到的是 'unsigned int' 而不是函数?

c - 修改 C 函数内的二维 malloc 数组