Maison > Article > développement back-end > Pourquoi la sortie d'un programme C avec des opérateurs post-incrémentés utilisés dans cout n'est-elle pas définie ?
Comportement non défini du post-incrémentation en C
En C , l'opérateur de post-incrémentation (i ) augmente la valeur d'une variable de 1 après son évaluation. Lorsqu'il est utilisé en combinaison avec l'opérateur d'insertion (<<) dans cout, l'ordre des opérations devient crucial.
Programme 1
Considérez l'extrait de code suivant :
<code class="cpp">#include <iostream> using namespace std; main(){ int i = 5; cout << i++ << i-- << ++i << --i << i << endl; }</p> <p>La sortie de ce programme n'est pas définie. Selon la norme C, lorsqu'un effet secondaire sur un objet scalaire (tel que i) n'est pas séquencé par rapport à un autre effet secondaire ou à un calcul de valeur utilisant le même objet, le comportement n'est pas défini.</p> <p><strong>Explication : </strong></p> <p>L'expression cout << je &Lt ;&Lt ; je-- &Lt ;&Lt ; je &Lt ;&Lt ; --je &Lt ;&Lt ; i est équivalent à la séquence d'opérations suivante :</p> <ol> <li>i : incrémente i à 6 et renvoie 5.</li> <li>i-- : décrémente i à 5.</li> <li> i : incrémente i à 6.</li> <li>--i : décrémente i à 5.</li> <li>i : renvoie 5.</li> </ol> <p>Cependant, la norme ne définit pas le ordre dans lequel ces effets secondaires se produisent. Cela signifie que le compilateur peut les exécuter dans n'importe quel ordre, ce qui peut entraîner une sortie différente à chaque exécution du programme. Dans ce cas spécifique, la sortie est "55555" car les effets secondaires sont exécutés dans l'ordre indiqué ci-dessus.</p> <p><strong>Programme 2</strong></p> <p>Le programme suivant démontre également un comportement non défini :</p> <pre class="brush:php;toolbar:false"><code class="cpp">int x = 20, y = 35; x = y++ + y + x++ + y++; cout << x << endl << y;</code>
La sortie attendue de ce programme est 126 et 37. Cependant, en raison d'un comportement non défini, la sortie réelle peut varier en fonction de l'implémentation du compilateur.
Morale de l'histoire :
Il est essentiel d'éviter d'utiliser le post-incrément en combinaison avec cout ou toute autre opération qui repose sur les effets secondaires de l'incrément. Au lieu de cela, utilisez des lignes séparées pour modifier et imprimer la variable afin de garantir un comportement prévisible.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!