7

我目前正在处理别人的代码,有这样的声明

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

// Do things

}while(x.inc())

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

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

  • 为什么我们可以ifdo?
  • 它有什么作用?
  • 还有什么可以放在和do之间{

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

4

5 回答 5

9

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

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

do {
    if(y.foo(x)) {
        // Do things
    }
} while(x.inc());
于 2015-07-29T10:36:22.580 回答
5

do-while 语句定义如下

do statement while ( expression ) ;

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

至于你的问题

• 在do 和{ 之间还可以添加什么?

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

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

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

例如,您帖子中的 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
于 2015-07-29T10:36:47.997 回答
2

根据 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

于 2015-07-29T11:05:40.013 回答
0

do while 语句的语法是:

do 语句 while ( 表达式 ) ;

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

在您的情况下, if 块是一个完整的语句,它非常好。

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

int i = 0;

do std::cout<<i<<std::endl;
while (i++ < 5);
于 2015-07-29T10:45:46.640 回答
0

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

我个人会这样写:

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

如果只有一个“行”,则 do 之后的语句不需要括号。就好像,只有在有更多指令时才使用方括号。在这种情况下,括号用于 if 并且因为 do-while 只有一条指令,所以他不使用括号。

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

于 2015-07-29T10:50:02.560 回答