La syntaxe ci-dessous de l'écriture d'une boucle do while
while contenant une seule instruction sans utiliser d'accolades comme les autres boucles, à savoir while, for, etc.
correcte? J'obtiens la sortie requise mais je veux savoir si cela a un comportement indéfini.
int32_t i = 1; do std::cout << i << std::endl; while(++i <= 10);
6 Réponses :
cppreference indique que c'est la même chose avec do while
que avec while
et if
et ainsi de suite.
La syntaxe pertinente:
attr (facultatif) do statement while ( expression );
- attr (C ++ 11) - n'importe quel nombre d'attributs
- expression - toute expression qui est contextuellement convertible en booléen. Cette expression est évaluée après chaque itération, et si elle renvoie false, la boucle est quittée.
- instruction - toute instruction, généralement une instruction composée, qui est le corps de la boucle
La clé ici est qu'une instruction est généralement une instruction composée entre accolades, mais pas nécessairement.
Comme pour ces constructions, j'aurais tendance à préférer les accolades même s'il ne s'agit que d'une seule ligne, mais il est bon de savoir que cela fonctionne.
Non, tout va bien! Toute boucle en C ++ qui attend des accolades et ne les trouve pas prend en compte la première ligne et continue.
Ce n'est pas nécessairement vrai, par exemple avec les définitions de fonction et de classe.
Le corps d 'une construction do
- while
doit être une instruction .
attr(optional) do statement while ( expression ) ;
attr (C ++ 11) - n'importe quel nombre d'attributs
expression - toute expression qui est contextuellement convertible en booléen. Cette expression est évaluée après chaque itération, et si elle renvoie false, la boucle est quittée.
instruction - toute instruction, généralement une instruction composée, qui est le corps de la boucle
cppreference note que cette instruction est généralement une instruction composée , qui est un bloc entouré d'accolades.
Les instructions ou blocs composés sont des séquences d'instructions entre accolades.
Cependant, cette instruction peut également être simplement une expression terminée par un point-virgule, ce qui est le cas dans votre exemple.
Si vous n'avez qu'une seule instruction dans le do-while
ou if
ou for
, les accolades ne sont pas nécessaires
c'est à dire
if(cond) { statement1; } statement2;
est le même que
if(cond) statement1; statement2;
D'un autre côté
également
if(cond) { statement; }
est pareil
if(cond) statement;
Si vous écrivez
do { statement; } while (cond)
Ensuite, cela sera considéré comme
do statement; while (cond)
La grammaire pour une boucle do-while est donnée ici :
faire l' instruction while ( expression );
La grammaire d'une instruction permet une expression-instruction :
déclaration:
attribut-spécificateur-seq opt instruction-expression
expression-instruction:
expression opt;
Le corps d'un do-while n'a donc pas besoin d'être à l'intérieur de {}
, et votre code est valide.
La ressource originale pour répondre à cette question devrait être les normes C ++: http://www.open-std.org/jtc1/sc22/wg21/docs/standards . Dans C ++ 17, les instructions 9.5 Iteration [stmt.iter] indiquent que do
prend une instruction:
faire l'instruction while (expression);
Donc c'est vraiment bien.
9.3 Instruction composée ou bloc [stmt.block] dit
Pour que plusieurs instructions puissent être utilisées là où une est attendue, l'instruction composée (également, et de manière équivalente, appelée «bloc») est fournie.
donc les gens ont tendance / aiment utiliser { ... }
pour do
déclarations.