【问题标题】: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

标签: c# loops syntax while-loop


【解决方案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”并且)由另一个线程设置 - 所以使用这个成语不一定是“错误”(但我反对具体的构造)。
  • 我在某处读到允许编译器优化诸如此类的无限循环;让我看看我能不能找到我在哪里读到这个......
  • ';'不用作空块的替换,而是一个空语句。 “while(condition) statement”也是一种用单个语句编写while循环的方法。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    仅由

    组成的语句

    ;

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

    {
    }
    

    它们都不执行任何操作。

    【讨论】:

      【解决方案4】:

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

      当我们写作时

      while(true);
      

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

      while(true)
      i++;
      

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

      【讨论】:

        猜你喜欢
        • 2022-01-17
        • 1970-01-01
        • 1970-01-01
        • 2014-04-05
        • 2011-07-22
        • 2020-12-04
        • 1970-01-01
        • 2015-12-05
        • 2015-07-06
        相关资源
        最近更新 更多