【问题标题】:In c or c++ can a loop have both "do" and "while" sections?在 c 或 c++ 中,循环可以同时包含“do”和“while”部分吗?
【发布时间】:2020-01-21 17:25:58
【问题描述】:

鉴于do ... whilewhile 循环中常见的while() 语句,以及while 循环体的位置将被替换为do ... while 上的分号的方式,就好像它是一个复合语句变成空语句(或结束长语句的行):

任何 C 系列语言中的语法是否允许定义两个主体的“do while 和 while”循环?

大概语义是一个循环,其中一些操作发生在检查之前和之后。

例如:

do {
  foo();
} while ( baz() == true ){
  bar();
}

foo() 总是会出现一次,但 bar() 只会在 baz() 返回 true 之后出现。

【问题讨论】:

  • 其实这个问题我是分不清的。
  • 您想要一个在条件检查后带有块的 do-while 循环吗?如果条件为假,那将如何执行?
  • 它不会像 while 循环那样。
  • @PaulOgilvie OP 想要一个循环条件可能在中间的循环,这是一种循环结构,由 Ada 推广,其语句 exit when 子句 (adaic.org/resources/add_content/standards/05aarm/html/…) 顺便说一句允许还有一个多级出口(在 C++ 中只能使用 goto ;-)。

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


【解决方案1】:

它们不能同时使用。语法是:

while (表达式) 语句

或:

语句 while (表达式) ;

所以你不能像你的例子那样做:

do {
  foo();
} while ( baz() == true ){
  bar();
}

但是你可以接近这个:

do {
  foo();
  if (!baz()) break;
  bar();
} while (1);

【讨论】:

    【解决方案2】:

    你似乎在要求

    do
        statement0
    while (condition)
        statement1
    

    这可以通过以下方式完成:

    do
    {
        statement0
        if (!(condition)) break;
        statement1
    } while (1);
    

    【讨论】:

    • 如果我真的想这样做,我会这样做。如果存在的话,我正在谈论的(显然是假设的)结构将是一个晦涩的很少使用的语法片段。使用它是不好的做法。
    • 我认为在这个语句中的 statement0 会比在正常的 while 循环中多执行一次。
    • @NO_NAME:这就是问题所要求的。
    • 抱歉,我想到了一个 do-while 循环。无论如何,我在考虑这个问题,只有当 statement1 能够改变条件的结果时,我的陈述才是正确的。在这种情况下,我们需要在循环结束时再次检查条件。
    • 这实际上相当复杂。如果是第一个语句不能改变检查结果的情况,我们只需要第一次测试它,如果条件计算成本足够高,这可能允许一些优化。不过,也许我想太多了。两次检查的解决方案应该是万无一失的。
    【解决方案3】:

    在 C 或 C++ 中,循环是否可以同时包含“do”和“while”部分?

    任何 C 系列语言中的语法是否允许定义两个主体的“do while 和 while”循环?

    不,您可以使用 while 循环或 do-while 循环。 while 循环与 do-while 循环不同,反之亦然。

    您不能将这两种类型合并在一起。


    只能是do-while循环:

    do 
    { 
        /* statements  */ 
    }while(condition);
    

    或者一个while循环:

    while(condition)
    {
        /* statements */
    };
    

    在 while 循环中,您在某个条件之后执行语句。在 do while 循环中,您至少在循环中运行一次,直到达到条件。但是两个循环的中心最后都是同一种语句/循环体。因此,添加第二个是没有意义的。


    当您使用 do-while 循环时,就像您所做的那样:

    do {
      foo();
    } while ( baz() == true ){
      bar();
    }
    

    在do-while循环条件后{}包围的区域:

    {
      bar();
    }
    

    不是 do-while 循环的一部分。


    它将被视为仅在一个单独的范围块中的一堆语句,这些语句将在 do-while-loop 完成/完成之后执行。

    但即便如此,如果你在 do-while-loop 条件后设置了分号 ;,编译器也只会让它通过:

    do {
      foo();
    } while ( baz() == true );{      // Note the semicolon ";".
      bar();
    }
    

    使用提供的代码:

    do {
      foo();
    } while ( baz() == true ){
      bar();
    }
    

    编译器会抛出错误。

    【讨论】:

    • 那么你是说你测试了这个并且没有收到编译器错误? IE。 “不是do-while的一部分,但将被执行”。这让我很惊讶。我预计缺少的 ; 会编译失败。
    • @Yunnosch 是的,我已经测试过了。它就是这样工作的。
    • 我以为我们正在讨论您的答案中显示的代码。或多或少do {/**/} while(0){/**/}。你指的是do {/**/} while(0);{/**/}吗?这当然会符合您的陈述,但它不是您答案中的代码。
    • 是的,现在我喜欢这个答案,很好的解释。
    • 很高兴参与建设性的讨论。 (实际上,我很尊重它的建设性。我现在意识到我的第一条评论可以用一种激进的“声音”来解读。)
    【解决方案4】:

    在 C 或 C++ 中不允许在同一循环中同时使用 do 和 while 块。 任何其他编程语言也不允许这样做。

    【讨论】:

    • 你怎么知道其他编程语言不允许这样做?
    猜你喜欢
    • 2018-05-09
    • 1970-01-01
    • 2016-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多