如果在 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 循环的条件之后放置一个分号会发生啥?的主要内容,如果未能解决你的问题,请参考以下文章