执行 if(){ } while() 语句
Do if(){ } while() statement
我目前正在处理其他人的代码,其中包含这样的语句
if(x.start()) do if(y.foo(x)) {
// Do things
}while(x.inc())
此处 x
是自定义 class,它保存有关 y
的信息,并允许以特殊顺序迭代其元素。如果相关,我会提供此信息,但我的问题更笼统:
我认为在 do{}while()
语句中 do
部分必须跟在方括号后面,而这个与最后的 while()
条件一起定义了 do-while循环。
- 为什么我们可以在
do
之后放一个 if
?
- 它有什么作用?
do
和{
之间还可以加什么?
我找不到与此或 google 相关的其他问题,大多数与将 if
语句放入 while loop
相关的问题。
语法允许 do
和 while
之间的任何 语句 。只是您通常会在那里看到一种特定形式的 语句 - 复合语句 、{ /* statements */ }
,通常也称为块。
代码的 do-while 部分完全等同于
do {
if(y.foo(x)) {
// Do things
}
} while(x.inc());
do-while语句定义如下
do statement while ( expression ) ;
所以在 do 和 while 之间可以有任何语句,包括 if 语句。
关于你的问题
•What else can be put in between do and {?
根据语法,do后一定要有语句。因此,唯一可能看起来很奇怪但有效的可能性是放置标签。例如
do L1: { std::cout << "Hello do-while!" << std::endl; } while ( false );
因为也可以使用带标签的语句。
例如,您 post 中的 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
do while语句的语法是:
do statement while ( expression ) ;
基本上,您可以在 do 关键字之后和 while 关键字之前放置任何语句。在通常情况下,我们在 do 后面加上大括号以允许对多个语句(复合语句)进行分组,但是如果您只想在 do 关键字后放置一个语句,则大括号是可选的。尽管我强烈建议使用大括号来提高可读性。
在你的情况下,if 块是一个完整的语句并且完全没问题。
这是包含单个语句的 do 语句的另一个示例。
int i = 0;
do std::cout<<i<<std::endl;
while (i++ < 5);
我认为这种缩进会造成一些混乱。
我会亲自写这个:
if(x.start())
do
if(y.foo(x)) {
// Do things
}
while(x.inc())
do 后面的语句如果只有一个就不需要括号"line"。和 if 一样,只有当你有更多的指令时,你才使用括号。在这种情况下,括号用于 if,因为 do-while 只有一条指令,所以他不使用括号。
这是我的想法,如果有人能证实就更好了。
根据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
...
因此您可以在 do
和 while
之间放置任何有效的 语句 。
请注意,在 do 语句中,重复执行子语句,直到 expression
的值变为 false
。测试在每次执行 statement
.
之后进行
我目前正在处理其他人的代码,其中包含这样的语句
if(x.start()) do if(y.foo(x)) {
// Do things
}while(x.inc())
此处 x
是自定义 class,它保存有关 y
的信息,并允许以特殊顺序迭代其元素。如果相关,我会提供此信息,但我的问题更笼统:
我认为在 do{}while()
语句中 do
部分必须跟在方括号后面,而这个与最后的 while()
条件一起定义了 do-while循环。
- 为什么我们可以在
do
之后放一个if
? - 它有什么作用?
do
和{
之间还可以加什么?
我找不到与此或 google 相关的其他问题,大多数与将 if
语句放入 while loop
相关的问题。
语法允许 do
和 while
之间的任何 语句 。只是您通常会在那里看到一种特定形式的 语句 - 复合语句 、{ /* statements */ }
,通常也称为块。
代码的 do-while 部分完全等同于
do {
if(y.foo(x)) {
// Do things
}
} while(x.inc());
do-while语句定义如下
do statement while ( expression ) ;
所以在 do 和 while 之间可以有任何语句,包括 if 语句。
关于你的问题
•What else can be put in between do and {?
根据语法,do后一定要有语句。因此,唯一可能看起来很奇怪但有效的可能性是放置标签。例如
do L1: { std::cout << "Hello do-while!" << std::endl; } while ( false );
因为也可以使用带标签的语句。
例如,您 post 中的 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
do while语句的语法是:
do statement while ( expression ) ;
基本上,您可以在 do 关键字之后和 while 关键字之前放置任何语句。在通常情况下,我们在 do 后面加上大括号以允许对多个语句(复合语句)进行分组,但是如果您只想在 do 关键字后放置一个语句,则大括号是可选的。尽管我强烈建议使用大括号来提高可读性。
在你的情况下,if 块是一个完整的语句并且完全没问题。
这是包含单个语句的 do 语句的另一个示例。
int i = 0;
do std::cout<<i<<std::endl;
while (i++ < 5);
我认为这种缩进会造成一些混乱。
我会亲自写这个:
if(x.start())
do
if(y.foo(x)) {
// Do things
}
while(x.inc())
do 后面的语句如果只有一个就不需要括号"line"。和 if 一样,只有当你有更多的指令时,你才使用括号。在这种情况下,括号用于 if,因为 do-while 只有一条指令,所以他不使用括号。
这是我的想法,如果有人能证实就更好了。
根据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
...
因此您可以在 do
和 while
之间放置任何有效的 语句 。
请注意,在 do 语句中,重复执行子语句,直到 expression
的值变为 false
。测试在每次执行 statement
.