做if(){} while()语句

时间:2015-07-29 10:32:33

标签: c++ do-while control-structure

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

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

// Do things

}while(x.inc())

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

我认为在do{}while()语句中,do部分必须跟在括号后面,并且最后在while()条件的最后部分定义了do-while循环。

  • 为什么我们可以在if之后放置do
  • 它做了什么?
  • do{之间还有什么其他内容?

我无法找到与此相关或谷歌相关的其他问题,大多数相关内容都与if内的while loop语句相关。

5 个答案:

答案 0 :(得分:9)

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

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

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

答案 1 :(得分:5)

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

do statement while ( expression ) ;

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

关于你的问题

  

•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

答案 2 :(得分: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后都会进行测试。

答案 3 :(得分:0)

do while语句的语法是:

  

做语句while(表达式);

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

在你的情况下,如果block是一个完整的陈述,那就完全没问了。

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

int i = 0;

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

答案 4 :(得分:0)

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

我个人会写这个:

s3

do之后的语句如果只有一个“行”则不需要括号。与此相同,只有在有更多说明时才使用括号。在这种情况下,括号用于if,因为do-while只有一条指令,他不使用括号。

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