I am currently working on somebody's else code, with a statement like this
if(x.start()) do if(y.foo(x)) {
// Do things
}while(x.inc())
here x
is custom class that holds information on y
and allows iteration through its element in a special order. I put this info if relevant, but my question is more general:
I thought that in a do{}while()
statement the do
part had to be followed by the bracket, and this togheter with the while()
condition at the end defines the do-while loop.
if
right after the do
? do
and {
?I couldn't find other questions relating to this or on google, most stuff related to putting if
statements inside while loop
.
The grammar permits any statement between do
and while
. It's just you usually see a particular form of statement there - the compound-statement, { /* statements */ }
, also commonly called a block.
The do-while portion of the code is exactly equivalent to
do {
if(y.foo(x)) {
// Do things
}
} while(x.inc());
The do-while statement is defined the following way
do statement while ( expression ) ;
So between the do and while there can be any statement including the if statement.
As for your question
•What else can be put in between do and {?
According to the grammar after the do there must be a statement. So the only possibility that can look strange but is valid is to place a label. For example
do L1: { std::cout << "Hello do-while!" << std::endl; } while ( false );
because labeled statements also may be used.
For example the do-while statement from your post could look like
if(x.start()) do Come_Here: if(y.foo(x)) {
// Do things
}while(x.inc())
Take into account that you also may use an empty statement. In this case it will look like
do ; while ( false );
or
do Dummy:; while ( false );
And one more funny statement
do One: do Two: do Three:; while ( 0 ); while ( 0 ); while ( 0 );
Also in C++ declarations are also statements. So you may place a declaration between the do and while.
For example
int n = 10;
do int i = ( std::cout << --n, n ); while ( n );
In C declarations are not statements. So you may not place a declaration between the do and while in C.
And another funny example
#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;
}
The program output is
1 2 3
According to C++14 standard,
§6.5 Iteration statements:
do statement while ( expression );
Where statement
can be:
§6 Statements:
labeled-statement
expression-statement
compound-statement (also, and equivalently, called “block”):
{ statement-seq }
statement-seq:
statement
statement-seq statement
...
So you can put any valid statements in between do
and while
.
Note that, in the do statement the substatement is executed repeatedly until the value of the expression
becomes false
. The test takes place after each execution of the statement
.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With