编程语言中的空语句是否为汇编程序中的C,Java,... no-op?

时间:2011-08-30 08:04:04

标签: programming-languages

几天前,我看到for ( ; ; )导致无限循环。这让我对两件事感到好奇。

  1. 汇编程序中的空语句(;)no-op
  2. 为什么在上面给出的例子中评估为“true”?

1 个答案:

答案 0 :(得分:6)

从C角度回答:

不,;不会转换为无操作指令。无操作指令(例如nop)是明确的汇编级指令,它们实际上倾向于< em>做的东西(因为它们消耗时间,但不一定影响CPU中的任何存储状态)。

for(;;)代码段是for循环,其中三个部分均为默认值。在这种情况下,您可以将;视为不是空语句,而是(a)部分的分隔符。

  • 第一部分(初始化)默认为“不做任何事”。
  • 第二部分是循环将继续的条件。它的默认值是永远持续。
  • 第三部分,即开始后续迭代之前要采取的步骤,也是“什么都不做”。

过去,我曾犯过使用以下内容的令人发指的罪行:

#define ever ;;
#define forever for (;;)

这样我就可以编写无限循环:

for(ever) { ... }
forever { ... }

我当然不会这样做。


(a)一个“真正的”空陈述:

if (condition) {
    a = b;
    ;
}

也可能不会转化为无操作。很可能它根本不会产生任何代码。

请记住,这是基于相当常见的行为。就C而言,;可以生成它想要的任何低级代码,只要它不影响作为C环境的“虚拟机”即可。例如,如果您启用了性能分析,它可能会增加隐藏的行号变量并更新覆盖率统计信息。