【问题标题】:Simple do while loop using while(true);使用 while(true) 进行简单的循环;
【发布时间】:2013-02-02 18:39:54
【问题描述】:

在 C 程序的示例中,我多次遇到这种循环。这些循环到底有什么作用?

do {

    while (...) // Check some condition if it is true.
    { 
        calculation 1
    }

    // Some new condition is checked.

} while(true);

while(true);需要什么@是用于无限循环吗?有人可以解释一下上述循环的真正作用。我是 C 编程新手

【问题讨论】:

  • 我从未见过do while(true)。这是一个无限循环,但是在for (;;) 中编写一个惯用(且清晰)的方式。

标签: c loops do-while


【解决方案1】:

当一个人想要永远循环并且循环的中断条件未知时使用这些循环。某些条件与 breakreturn 语句一起在循环内设置以退出循环。 例如:

while(true){
    //run this code
    if(condition satisfies)
        break;    //return;
}

这些循环就像任何其他带有停止循环条件的 while 循环一样位于 while 循环的主体中,否则它将永远运行(在需要之前,这绝不是部分代码的意图)。 这取决于程序员的逻辑,只取决于他/她想做什么。

【讨论】:

    【解决方案2】:

    是的,它用于无限循环,在这种情况下,最佳做法是根据条件跳出查看

    do {
    
        while () //check some condition if it is true
         { 
         calculation 1
        }
    
        //some  new condition is checked,if condition met then break out of loop
    
    
        } while(true);
    

    【讨论】:

      【解决方案3】:

      在 C 中,当条件为真时,所有循环都会循环。因此,条件中的显式true 真正意味着“在true 为真时循环”,因此永远循环。

      【讨论】:

      • for(;;) 哪里或者什么条件? :-)
      • @Jens 我只能访问 C++11 规范,但它说 for 循环等同于 while 循环,第 6.5.3 节的第 2 节说“缺少条件使隐含的while 子句等同于while(true)"
      • @Jens 在 6.8.5.3 (2) 中:“一个省略的 expression-2 被一个非零常量替换”,其中 expression-2是循环条件。因此,如果您不编写条件,则会隐式插入条件(当然,在 as-if 规则下,您会经常得到无条件跳转)。
      【解决方案4】:

      这个循环是无限的,如果你的程序用这样的 lop 终止,你需要在这样的循环中的给定条件下有一个 breakreturn(或在某些情况下抛出异常)语句,否则这样的程序永远不会终止。

      【讨论】:

        【解决方案5】:

        如果停止条件的检查既不能在前面(如forwhile)也不能在后面(如do{}while)完成,则无限循环很有用。相反,您只需永远循环,在代码中间您可以检查条件并中断:if(something) break;

        【讨论】:

          【解决方案6】:

          有时我们会使用它,例如:

          do
               recv(s , &buf, len, flags);
          while(true)
          

          一个来自winsock windows api的例子,通过这种方式你可以从一个端口监听。

          【讨论】:

            【解决方案7】:
            do {
              // code here
            } while(true);
            

            此循环无限运行,如果不停止可能会导致运行时错误。如果您正在执行这些类型的循环,请确保在其中包含一个 break 语句,以确保您的循环将在某个时候停止。

            类似

            if(condition)
               break;
            

            如果您的程序到达某个条件为真的点,它将自动结束 do-while 循环并继续执行之后的代码。

            【讨论】:

              【解决方案8】:

              以下循环之间的一般区别因素:

              while (condition) {action}
              do {action} while (condition)
              

              是前者用于发生次或更多次的循环,而后者用于发生一次或更多次的循环。

              换句话说,while 的条件在循环开始时检查,do while 的条件在循环结束时检查。

              您经常会看到开发人员似乎不知道关于do-while 的代码,因为他们会写:

              result = doSomething();
              while (result == NOT_FINISHED) {
                  result = doSomething();
              }
              

              最好写成:

              do {
                  result = doSomething();
              } while (result == NOT_FINISHED);
              

              但是,在条件始终为true 的特定情况下,这并不重要。以下循环基本上是等价的(真实情况使用1):

              for (;;) { doSomething(); }
              for (;;doSomething());
              
              while (1) { doSomething(); }
              do { doSomething(); } while (1);
              
              while (doSomething(),1);
              
              BADPAX: doSomething(); goto BADPAX;
              

              第一个for 循环可能是执行无限循环的规范方式,它利用了这样一个事实:如果您省略循环的继续条件,它会假定它始终为真。

              第二个for 循环只是将循环体移动到for 语句的每次迭代部分。

              第一个while 有时也会在野外看到,do-while 可能更少。这里唯一的区别是前者循环永远在循环顶部检查,后者循环永远在循环底部检查。

              最后的 while 循环以一种你可能永远不应该使用的方式使用 C 逗号运算符:-)

              最后一个现在非常罕见,但可能是他们都在机器代码级别优化到的。

              【讨论】:

                猜你喜欢
                • 2017-07-14
                • 2014-10-10
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2021-05-29
                • 2014-03-09
                • 1970-01-01
                • 2015-05-05
                相关资源
                最近更新 更多