执行 if(){ } while() 语句

Do if(){ } while() statement

我目前正在处理其他人的代码,其中包含这样的语句

if(x.start()) do if(y.foo(x)) {

// Do things

}while(x.inc())

此处 x 是自定义 class,它保存有关 y 的信息,并允许以特殊顺序迭代其元素。如果相关,我会提供此信息,但我的问题更笼统:

我认为在 do{}while() 语句中 do 部分必须跟在方括号后面,而这个与最后的 while() 条件一起定义了 do-while循环。

我找不到与此或 google 相关的其他问题,大多数与将 if 语句放入 while loop 相关的问题。

语法允许 dowhile 之间的任何 语句 。只是您通常会在那里看到一种特定形式的 语句 - 复合语句 { /* statements */ },通常也称为块。

代码的 do-while 部分完全等同于

do {
    if(y.foo(x)) {
        // Do things
    }
} while(x.inc());

do-while语句定义如下

do statement while ( expression ) ;

所以在 do 和 while 之间可以有任何语句,包括 if 语句。

关于你的问题

•What else can be put in between do and {?

根据语法,do后一定要有语句。因此,唯一可能看起来很奇怪但有效的可能性是放置标签。例如

do L1: { std::cout << "Hello do-while!" << std::endl; } while ( false );

因为也可以使用带标签的语句。

例如,您 post 中的 do-while 语句可能看起来像

if(x.start()) do Come_Here: if(y.foo(x)) {

// Do things

}while(x.inc())

请注意,您也可以使用空语句。在这种情况下,它看起来像

do ; while ( false );

do Dummy:; while ( false );

还有一个有趣的说法

do One: do Two: do Three:; while ( 0 ); while ( 0 ); while ( 0 );

在 C++ 中,声明也是语句。所以你可以在 do 和 while 之间放置一个声明。

例如

int n = 10; 
do int i = ( std::cout << --n, n ); while ( n );

在 C 中,声明不是语句。所以你不能在 C 中的 do 和 while 之间放置声明。

还有一个有趣的例子

#include<iostream>
#include <vector>
#include <stdexcept>

int main()
{
    std::vector<int> v = { 1, 2, 3 };
    size_t i = 0;

    do try { std::cout << v.at( i ) << ' '; }  catch ( const std::out_of_range & ) 
    { std::cout << std::endl; break; } while ( ++i );

    return 0;
}

程序输出为

1 2 3

do while语句的语法是:

do statement while ( expression ) ;

基本上,您可以在 do 关键字之后和 while 关键字之前放置任何语句。在通常情况下,我们在 do 后面加上大括号以允许对多个语句(复合语句)进行分组,但是如果您只想在 do 关键字后放置一个语句,则大括号是可选的。尽管我强烈建议使用大括号来提高可读性。

在你的情况下,if 块是一个完整的语句并且完全没问题。

这是包含单个语句的 do 语句的另一个示例。

int i = 0;

do std::cout<<i<<std::endl;
while (i++ < 5);

我认为这种缩进会造成一些混乱。

我会亲自写这个:

if(x.start())
    do
        if(y.foo(x)) {
            // Do things
        }
    while(x.inc())

do 后面的语句如果只有一个就不需要括号"line"。和 if 一样,只有当你有更多的指令时,你才使用括号。在这种情况下,括号用于 if,因为 do-while 只有一条指令,所以他不使用括号。

这是我的想法,如果有人能证实就更好了。

根据C++14标准,

§6.5 迭代语句:

do statement while ( expression );

其中 statement 可以是:

§6 语句:

labeled-statement
expression-statement
compound-statement (also, and equivalently, called “block”):   
    { statement-seq }
    statement-seq:   
        statement
        statement-seq statement
...

因此您可以在 dowhile 之间放置任何有效的 语句

请注意,在 do 语句中,重复执行子语句,直到 expression 的值变为 false。测试在每次执行 statement.

之后进行