在C语言中,我可以这样做:
int main()
{
printf("HELLO WORLD");;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
}
而且它运行成功了!为什么会这样呢?
我的个人想法是:分号是一个无操作(从维基百科)指示符,有一堆分号的字符串与只有一个分号告诉C语言一个语句已结束具有相同的意义。
在C语言中,我可以这样做:
int main()
{
printf("HELLO WORLD");;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
}
而且它运行成功了!为什么会这样呢?
我的个人想法是:分号是一个无操作(从维基百科)指示符,有一堆分号的字符串与只有一个分号告诉C语言一个语句已结束具有相同的意义。
while (x[i++] = y[j++])
;
这里,所有的工作都在循环测试条件中完成,因此需要一个空语句。但是,即使没有控制循环,也允许使用空语句。
嗯,预处理器的许多用途可能会扩展到一些实际的C代码,或者基于一些早期的定义而被删除,但是......
MY_MACRO1();
MY_MACRO2();
预处理器只能替换MY_MACROX()
文本,不能移除尾随的分号,有可能是一个空语句之后的分号。如果编译器拒绝这个操作,那么使用预处理器将会更加困难,或者调用预处理器将不再像非预处理器函数调用一样(需要在宏定义中输出分号,并且在使用时调用方需要避免尾随分号),这将使得实现对于性能、调试和定制化目的的聪明宏替换函数更加困难。
C语言允许使用空语句。它们可以用于像空循环这样的场景:
while (*d++ = *s++)
; // null statement.
0;
1+1;
这两个都包含表达式,但没有副作用,因此它们实际上并没有做任何事情。虽然允许这样做,但编译器可能会发出警告。
一个好的编译器通常不会为上述任何内容生成任何代码(大多数甚至在关闭优化时也不会生成代码,我无法想象开启优化后会生成代码的编译器)。
两个分号在一起会生成一个空语句。C语言允许有空语句 - 它们不会产生任何代码。
for
语句的语法是:for (clause-1; expression-2; expression-3) statement
。正如您所看到的,被控制的是一个语句,但其他的只是表达式,而不是语句(好吧,clause-1可以是表达式或声明,但它仍然不是语句)。 - Jerry Coffinfor ( init-statement condition ; expression )
,而 init-statement
明确是一个语句。我得挖出一份旧草案才能确定,但我 认为 那时候,for
循环中的第一个子句是一个独特的东西,无法追溯到实际的语句(或者我的记忆只是太差了——在我这个年龄,这种情况太常见了)。 - Jerry Coffin因为在C语言中分号代表一个语句的结束,在你的情况下,更多的分号代表更多的空语句......这没有问题,它们只是空语句。
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,你的个人想法是正确的。
else
之前立即放置分号是一个错误——编译器不会接受它。 - Jerry Coffin