if if(){} while()语句

Thr*_*iag 7 c++ control-structure do-while

我目前正在处理某人的其他代码,并有这样的声明

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

// Do things

}while(x.inc())
Run Code Online (Sandbox Code Playgroud)

这里x是自定义类,它包含信息y并允许以特殊顺序迭代其元素.如果相关,我会提供此信息,但我的问题更为笼统:

我认为在一个 do{}while()声明中该do部分必须跟随括号,并且这个最后while()条件的togheter 定义了do-while循环.

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

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

T.C*_*.C. 9

语法允许和之间的任何声明.只是你通常会在那里看到一种特殊形式的陈述 - 复合语句,通常也称为块.dowhile{ /* statements */ }

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

do {
    if(y.foo(x)) {
        // Do things
    }
} while(x.inc());
Run Code Online (Sandbox Code Playgroud)


Vla*_*cow 5

do-while语句按以下方式定义

do statement while ( expression ) ;
Run Code Online (Sandbox Code Playgroud)

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

至于你的问题

•在和{之间可以放入什么?

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

do L1: { std::cout << "Hello do-while!" << std::endl; } while ( false );
Run Code Online (Sandbox Code Playgroud)

因为也可以使用带标签的陈述.

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

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

// Do things

}while(x.inc())
Run Code Online (Sandbox Code Playgroud)

考虑到您也可以使用空语句.在这种情况下,它看起来像

do ; while ( false );
Run Code Online (Sandbox Code Playgroud)

要么

do Dummy:; while ( false );
Run Code Online (Sandbox Code Playgroud)

还有一个有趣的说法

do One: do Two: do Three:; while ( 0 ); while ( 0 ); while ( 0 );
Run Code Online (Sandbox Code Playgroud)

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

例如

int n = 10; 
do int i = ( std::cout << --n, n ); while ( n );
Run Code Online (Sandbox Code Playgroud)

在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;
}
Run Code Online (Sandbox Code Playgroud)

程序输出是

1 2 3
Run Code Online (Sandbox Code Playgroud)