如果在 while 循环的条件之后放置一个分号会发生啥?

Posted

技术标签:

【中文标题】如果在 while 循环的条件之后放置一个分号会发生啥?【英文标题】:What happens when one places a semi-colon after a while loop's condition?如果在 while 循环的条件之后放置一个分号会发生什么? 【发布时间】:2012-02-01 03:08:37 【问题描述】:

我遇到过几次这样的情况:

while (true) 

while (age == 5); //What does this semi-colon indicate?
//Code
//Code
//Code


while(true) 表示这是一个无限循环,但是我很难理解while 条件后的分号完成了什么,是不是相当于这个?:

while (age == 5)  

//Code
//Code

换句话说,这是否意味着while循环没有用,因为它永远不会进入块?

【问题讨论】:

你问的是 C 还是 C#?你用两者都标记了这个问题。 我没有线索......逻辑上它什么都不做 我已经看到它在两种语言中都有出现,它在两种语言中的行为是否不同? 如果age == 5 你会得到一个无限循环。它只会在age != 5 在某个阶段(不同的线程?)时退出。 JIT 编译器会将其转换为 HCF 机器指令(Halt 和 Catch Fire)。扑灭火灾取决于机器。背景信息在这里:en.wikipedia.org/wiki/Halt_and_Catch_Fire 【参考方案1】:
while (age == 5);     // empty statement

等价于

while (age == 5)    // empty block

更新:即使没有要执行的主体,也不意味着循环终止。相反,它将简单地在条件(可能具有或依赖于副作用)上重复循环,直到满足为止。这是带有goto 的等效形式:

loop:
if (age == 5)
  goto loop;

此构造有时用作busy-loop,等待线程代码中更改的标志。 (确切的使用和有效性因语言、算法和执行环境而异。)

我发现将; 用于 "empty block" 空语句是一个值得怀疑的构造,原因如下:

while (age == 5); 
   Console.WriteLine("I hate debugging");

(我之前已经多次看到这个错误,当添加新代码时。)

编码愉快。

【讨论】:

这就是我的想法——让我感到困惑的是,我已经无数次看到它用于说明多线程同步问题。我怀疑这是一个错误,因为它重复了。 @Sean 是等价的语法。大概age 是(“volatile”并且)由另一个线程设置 - 所以使用这个成语不一定是“错误”(但我反对具体的构造)。 我在某处读到允许编译器优化诸如此类的无限循环;让我看看我能不能找到我在哪里读到这个...... 啊,看看这些不确定的问题:***.com/questions/2178115/… 和 ***.com/questions/3592557/…。 ';'不用作空块的替换,而是一个空语句。 “while(condition) statement”也是一种用单个语句编写while循环的方法。【参考方案2】:

while (age == 5); 陷入无限循环。在 c 中,; 是一个空终止符。编译器假定上述循环只有一个语句;,这会导致循环无限迭代。

【讨论】:

【参考方案3】:

仅由

组成的语句

;

是一个空语句。和块(也叫复合语句)一样,里面什么都没有



它们都不执行任何操作。

【讨论】:

【参考方案4】:

如果我们将; 放在任何地方,则意味着null 语句(什么都不做的语句)。

当我们写作时

while(true);

这意味着一个while循环一个什么都不做的语句。它类似于

while(true)
i++;

这里的语句不是null,但前面的case语句是null

【讨论】:

以上是关于如果在 while 循环的条件之后放置一个分号会发生啥?的主要内容,如果未能解决你的问题,请参考以下文章

while与do while 区别 for循环的简介及break和continue的区别

本期为大家介绍do-while循环

本期为大家介绍do-while循环

本期为大家介绍do-while循环

while循环

forfor in和while以及do while