if(){}和do while()语句的使用方法是什么?

7

我目前正在处理别人的代码,其中有一个语句如下:

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

// Do things

}while(x.inc())

这里的x是一个自定义类,它保存了有关y的信息,并允许以特定顺序迭代其元素。如果相关,我会提供此信息,但我的问题更为普遍:

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

  • 为什么我们可以在do后面紧跟一个if
  • 它是做什么用的?
  • 还可以在do{之间放置什么?

我找不到其他与此相关的问题或谷歌上的内容,大多数与在while loop中放置if语句有关。


3
“我认为在 do{}while() 语句中,do 部分后面必须跟着括号”是不正确的。 - Jongware
5个回答

9

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

do-while 部分的代码与以下代码完全等效:

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

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语言中,声明不是语句。因此,在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

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执行之后。


0

do...while语句的语法如下:

do statement while ( expression ) ;

实际上,在do关键字和while关键字之间可以放置任何语句。通常,我们在do后面加上花括号来允许多个语句的分组(复合语句),但如果你想在do关键字后只放置一个语句,则花括号是可选的。虽然我强烈建议使用花括号来帮助提高可读性。

在您的情况下,如果块是一个完整的语句,那么就没有问题。

这里有另一个包含单个语句的do语句示例:

int i = 0;

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

C++语法没有用Backus-Naur形式来描述,只需要称之为语法。 - Lightness Races in Orbit

0

我认为这种缩进方式会造成一些混淆。

个人而言,我会这样写:

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

如果do后面只有一行代码,那么就不需要加括号。和if语句一样,只有在有多条指令时才需要加括号。在这种情况下,括号是用于if语句的,因为do-while只有一条指令,所以不需要加括号。

这是我的看法,如果有人能够确认会更好。


1
你经常省略大括号的习惯总有一天会给你带来严重的麻烦。 - Lightness Races in Orbit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接