0
votes

faire une boucle while sans {}

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);


0 commentaires

6 Réponses :


1
votes

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.


0 commentaires

0
votes

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.


1 commentaires

Ce n'est pas nécessairement vrai, par exemple avec les définitions de fonction et de classe.



1
votes

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.


0 commentaires

1
votes

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)


0 commentaires

2
votes

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.


0 commentaires

3
votes

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.


0 commentaires