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

g2ieeal7  于 2022-12-11  发布在  其他
关注(0)|答案(5)|浏览(422)

在C语言中我可以做以下事情:

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

而且很管用,为什么
我个人的想法:分号是一个NO OPERATION(来自Wikipedia)指示符,拥有一个巨大的分号字符串就像拥有一个分号并告诉C语句已经结束一样。

lmyy7pcs

lmyy7pcs1#

两个分号合起来就是一个空语句。C不介意有空语句--它们不会生成任何代码。

k2fxgqgv

k2fxgqgv2#

因为在C语言中分号标识语句的结尾,而在你的例子中,更多的分号标识更多的空语句......没有错,它们只是空语句。

az31mfrm

az31mfrm3#

分号是行终止符,表示代码已到达行尾,然后执行下一行代码。
一个证据是,您可以在一行中编写代码,不包括指令。

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

这可能意味着main(){ cout〈〈“输入两个数字”[THEN] cin〉〉a[THEN] cin〉〉b[THEN] cout〈〈“两个数字的和为”〈〈a+b[THEN]〈〈return 0[THEN]}
所以如果你要放置多个分号,就像,一个THEN,THEN,THEN,THEN,你个人的想法确实是正确的。

b4lqfgs4

b4lqfgs44#

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

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

这里,所有的工作都在循环测试条件中完成,所以空语句是可取的。但是,即使没有控制循环,也允许空语句。
为什么?
好吧,预处理器的许多用途可能会扩展到一些实际的C代码,或者根据一些早期的定义被删除,但鉴于...

MY_MACRO1();
 MY_MACRO2();

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

eivnm1vs

eivnm1vs5#

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

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

您刚刚创建了一系列的对象。
它还允许非完全空的语句,如:

0;
1+1;

这两个函数都包含表达式,但没有副作用,所以它们实际上不做任何事情。它们是允许的,尽管编译器可能会警告它们。
一个好的编译器通常不会为上述任何一个生成任何代码(大多数编译器甚至不会在关闭优化的情况下生成代码,我无法想象一个编译器会在打开优化的情况下生成代码)。

相关问题