【问题标题】:Is it possible to have a while loop in c++ that makes the check in the middle of the loop instead of the beginning or end?是否可以在 C++ 中使用 while 循环,在循环中间而不是开始或结束时进行检查?
【发布时间】:2010-12-20 21:31:09
【问题描述】:

我想要一个 while 循环执行以下操作,但这在 c++ 中可行吗?如果是这样,语法如何?


do {
    //some code
    while( expression to be evaluated );
    // some more code
}

我希望当 while 语句确定表达式不再为真时退出循环(即如果表达式为假,则不执行更多代码)

【问题讨论】:

  • if(condition) break; 有什么问题你为什么不用那个?
  • 对于您能想象到的每个可能的用例,没有(也不可能)语言结构。
  • 示例代码中的while 将编译为没有主体的循环,这可能是无限循环,具体取决于表达式。 do *statement* 后面必须跟 while,因此该部分不应编译。
  • 即使它可以工作,也会导致代码不可读,因此你甚至不应该“希望”它可以工作。

标签: c++ loops while-loop do-while


【解决方案1】:

你可以这样做:

while (1) {
   //some code
   if ( condition) {
       break;
   }
   // some more code
}

【讨论】:

  • 我知道我可以做到这一点,但我只是想知道它是否可以更像我在我的问题中提出的方式。你知道这样可以吗?
  • 我不相信,不。这是语言的设置方式,编译器不会识别它。即使他们确实编译了它,它也可能最终还是像上面的答案一样。
【解决方案2】:

一点背景知识和分析:我听说你要的东西叫做“Dahl loop”,以 Simula 声名鹊起的 Ole-Johan Dahl 命名。正如 Sean E. 所说,C++ 没有它们(除了 ima 的答案),尽管其他一些语言有(特别是 Ada)。它可以代替“do-while”和“while-do”循环,这使它成为一个有用的结构。更一般的情况允许任意数量的测试。虽然 C++ 没有 Dahl 循环的特殊语法,但 Sean McCauliff 和 A​​raK 的答案与它们完全等价。 “while (true)”循环应该被编译器变成一个简单的跳转,所以编译后的版本与假设的 Dahl 循环的编译版本完全没有区别。如果你觉得它更具可读性,你也可以使用

do {
    ...
} while (true);

【讨论】:

  • 顺便说一句,我依稀记得SO上的其他人用另一个名字称呼他们,也是一个姓氏。有谁知道这个名字可能是什么?有谁记得这篇文章以及它可能回应了什么?
  • N个半循环。谷歌对该术语的第一批回复之一:cs.duke.edu/~ola/patterns/plopd/loops.html#loop-and-a-half PS。迟到总比没有好
  • @Deiwin:感谢附加术语,但我要找的是姓氏。我很好奇的部分原因是它可能是以其他值得注意的人命名的,我想了解历史。该帖子可能已经丢失了时间。
【解决方案3】:

好吧,我认为你应该将条件移到循环的中间(?):

while (true)
{
  ...
  // Insert at favorite position
  if (condition)
    break;
  ...
}

【讨论】:

    【解决方案4】:

    从技术上讲,是的:

     for ( ;CodeBefore, Condition; ) {CodeAfter}
    

    【讨论】:

      【解决方案5】:

      答案是否定的,当 while 语句应该评估的条件为真时,您不能让循环自动终止,直到它在循环的顶部(或底部)实际评估它。 while 语句不能放在循环中间。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-08-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-06
        • 1970-01-01
        相关资源
        最近更新 更多