A l'intérieur d'une boucle while, est la dernière déclaration séparées par des virgules garantie pour exécuter la dernière?

StackOverflow https://stackoverflow.com/questions/4072578

Question

Considérez ce qui suit (trivial) segment de code:

while (i++, i <= 10) {
  // some more code
}

Dans le cas général, C ++ permet états séparés par des virgules à évaluer dans un ordre quelconque. Dans le cas d'une boucle while, nous sont au moins garantis (par la spécification) que la dernière déclaration (qui est utilisée comme condition de la boucle) évalué en dernier?

Était-ce utile?

La solution

  

Dans le cas général, C ++ permet séparés par des virgules états à évaluer dans un ordre quelconque.

Si vous faites référence aux virgules entre les arguments de fonction, qui est juste un séparateur.

Dans votre cas, vous utilisez le opérateur virgule , et qui présente un point de séquence qui garantit que de tous les effets secondaires de la virgule gauche opérande se sont installés avant d'évaluer la bonne.

Alors oui, il est bien défini.

De l'article 5,18 / 1 de l'ISO C ++ 98 type:

  

Une paire d'expressions séparées par une virgule est évaluée à droite-à gauche et la valeur de l'expression gauche est ignoré. Le lvalue à rvalue (4.1), à pointeur array (4.2), et la fonction à aiguille (4.3) conversions classiques ne sont pas appliqués à l'expression de gauche. Tous les effets secondaires (1,9) de l'expression à gauche, à l'exception de la destruction de 12.2 (temporaires), sont effectuées avant l'évaluation de l'expression droite. Le type et la   La valeur du résultat sont le type et la valeur de l'opérande droit; le résultat est une lvalue si son opérande droit est.

Autres conseils

Oui. L'opérateur , (à moins surchargé!) Introduit un soi-disant point de séquence et ne garantit en effet l'ordre d'exécution de gauche à droite.

Les commentaires ci-dessus a expliqué. Et l'un des moyens communs d'avoir abusé de cette méthode est

while(scanf("%d", &n), n){
    // do something
}

Cela lecture entier jusqu'à ce que nous lisons zéro.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top