Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Do if(){}while()语句_C++_Do While_Control Structure - Fatal编程技术网

C++ Do if(){}while()语句

C++ Do if(){}while()语句,c++,do-while,control-structure,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(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循环中有关。语法允许
do
while
之间的任何语句。只是你通常会在那里看到一种特殊的语句形式-复合语句,
{/*语句*/}
,也称为块

代码的do-while部分与

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

do while语句的定义方式如下

do statement while ( expression ) ;
所以在do和while之间可以有任何语句,包括if语句

int i = 0;

do std::cout<<i<<std::endl;
while (i++ < 5);
至于你的问题

•在do和{之间还可以放什么

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

do L1: { std::cout << "Hello do-while!" << std::endl; } while ( false );
int n = 10; 
do int i = ( std::cout << --n, n ); while ( n );
考虑到您也可能使用空语句。在这种情况下

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

// Do things

}while(x.inc())
do ; while ( false );

还有一个有趣的声明

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

也在C++声明中也是语句。因此,可以在DO和I../P>之间放置声明。 比如说

do L1: { std::cout << "Hello do-while!" << std::endl; } while ( false );
int n = 10; 
do int i = ( std::cout << --n, n ); while ( n );

do while语句的语法为:

在表达时做陈述

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

在您的例子中,if块是一个完整的语句,它是完美的

下面是包含单个语句的do语句的另一个示例

int i = 0;

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

我认为这种缩进会引起一些混乱

我个人会这样写:

if(x.start())
    do
        if(y.foo(x)) {
            // Do things
        }
    while(x.inc())
如果do后面的语句只有一行,则不需要括号。与if一样,只有在有更多指令时才使用括号。在这种情况下,括号用于if,因为do while只有一条指令,所以不使用括号


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

根据C++14标准

§6.5迭代语句:

do statement while ( expression );
labeled-statement
expression-statement
compound-statement (also, and equivalently, called “block”):   
    { statement-seq }
    statement-seq:   
        statement
        statement-seq statement
...
其中
语句可以是:

§6声明:

do statement while ( expression );
labeled-statement
expression-statement
compound-statement (also, and equivalently, called “block”):   
    { statement-seq }
    statement-seq:   
        statement
        statement-seq statement
...
因此,您可以将任何有效语句放在
do
while
之间


注意,在do语句中,子语句被重复执行,直到
表达式的值变为
false
。测试在每次执行
语句之后进行。“我认为在do{}while()语句中,do部分后面必须跟有括号”不正确。C++语法不是用Backus Naur形式描述的。把它称为语法。你的习惯,放弃括号将使你陷入严重的麻烦一天。