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

为什么在C中可以使用多个分号?,c,C,在C中,我可以执行以下操作: int main() { printf("HELLO WORLD");;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; } 而且它有效!为什么呢 我个人的想法是:分号是一个不可操作的指示符(来自维基百科),拥有一个巨大的分号字符串与拥有一个分号并告诉C一个语句已经结束的想法是一样的。两个分号一起构成一个空语句。C不介意使用空语句-它们不会生成任何代码。因为在C中分号表示语句的结尾,在您的例子中,分号越多表示空语句越多。。。没有错,它们只是空语

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

int main()
{
 printf("HELLO WORLD");;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
}
而且它有效!为什么呢


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

两个分号一起构成一个空语句。C不介意使用空语句-它们不会生成任何代码。

因为在C中分号表示语句的结尾,在您的例子中,分号越多表示空语句越多。。。没有错,它们只是空语句。

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

while (*d++ = *s++)
   ; // null statement.
您刚刚创建了一系列

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

0;
1+1;
这两个函数都包含表达式,但没有副作用,因此它们实际上什么都不做。它们是允许的,尽管编译器可能会对此发出警告


一个好的编译器通常不会为上述任何一种生成任何代码(大多数编译器甚至在关闭优化的情况下也不会生成代码,我无法想象在打开优化的情况下会生成任何代码)。

分号终止一条语句。。。连续分号不表示任何操作语句(如您所说)。考虑:

while (x[i++] = y[j++])
    ;
在这里,所有的工作都是在循环测试条件下完成的,因此需要一个空语句。但是,即使没有控制循环,也允许使用空语句

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

 MY_MACRO1();
 MY_MACRO2();

…预处理器只能替换
MY_MACROX()
文本,可能在空语句后留下尾随分号。如果编译器拒绝了这一点,那么使用预处理器会困难得多,或者预处理器调用不像非预处理器函数调用那样(它们必须在替换中输出分号,调用方在使用它们时必须避免尾随分号)-这将使实现更难在性能、调试和定制方面用聪明的宏替换函数。

分号是行终止符,表示它们告诉代码已到达行的末尾,然后执行下一行代码

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

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

main(){cout>a;cin>>b;cout b[THEN]分号可以分隔语句吗?你没有告诉编译器在这些分号之间做任何事情,那么有什么不应该这样做呢?@Blender:分号在C中不是一个真正的语句分隔符,它实际上是一个语句终止符。有些语言中它是一个语句分隔符。在这些语言中,分号后面是块中的final语句是可选的。编写没有任何用途的代码在任何编程语言中都是有效的。是什么让你认为C会成为例外?@DietrichEpp:不一定是可选的。例如在Pascal中(至少按照Wirth的定义)紧跟在
else
前面的分号是一个错误——编译器不会接受它。对于书呆子来说:是的,你毫无疑问是正确的:
For(;;)
同时包含两个分号,但不是空语句。或者它们最终生成
nop
instruction@JerryCoffin即使在for是空语句的情况下,它们也是计算为true的空语句…@aleroot:for
语句的语法是:
for(子句-1;表达式-2;表达式-3)语句
。正如您所看到的,受控制的是一个语句,但其他的只是表达式,而不是语句(好吧,子句1可以是表达式或声明,但它仍然不是语句)。@JoSo:按照当前的标准,是的。他们对语法规范做了一些修改,所以现在它是
(init statement condition;expression)
,而
init statement
是一个显式的语句。我必须找出一个旧的草稿才能确定,但我认为在那个时候,
for
循环中的第一个子句是一个独特的东西,无法追溯到实际的语句(要么是这样,要么就是我的记忆力不好——在我这个年龄就太可能了)。