Comment explique-t-on le résultat de l’expression (++ x) + (++ x) + (++ x)?

x = 1; std::cout << ((++x)+(++x)+(++x)); 

Je m’attends à ce que la sortie soit 11 , mais c’est en fait 12 . Pourquoi?

Nous l’expliquons en prévoyant un comportement indéfini plutôt qu’un résultat particulier. Lorsque l’expression tente de modifier x plusieurs fois sans sharepoint séquence intermédiaire , son comportement est indéfini .

Comme d’autres l’ont dit, les normes C et C ++ ne définissent pas le comportement que cela va produire.

Mais pour ceux qui ne voient pas pourquoi les normes feraient une telle chose, passons à travers un exemple du “monde réel”:

 1 * 2 + 3 + 4 * 5 

Il n’y a rien de mal à calculer 1 * 2 + 3 avant de calculer 4*5 . Le fait que la multiplication ait une priorité plus élevée que l’addition ne signifie pas que nous devons effectuer toute la multiplication dans l’expression avant de procéder à l’addition. En fait, il existe de nombreuses commandes pour lesquelles vous pouvez valablement effectuer vos calculs.

Lorsque les évaluations ont des effets secondaires, différents ordres d’évaluation peuvent affecter le résultat. Si la norme ne définit pas le comportement, n’y comptez pas .

Ceci est en fait non défini. C ++ ne définit pas explicitement l’ordre d’exécution d’une instruction, donc cela dépend du compilateur et cette syntaxe ne doit pas être utilisée.

L’extrait de code invoquera un comportement indéfini à la fois en C / C ++. Lisez à propos de Sequence Point à partir d’ ici .

À mon avis

 cout<<((++x)+(++x)+(++x)); 

le compilateur commence par le préfixe ++ x pour que la valeur de x devienne

x = 2


maintenant par ++ x, x deviendra

x = 3


après ++ x

x = 4


Il est maintenant temps d'append les valeurs de x

x + x + x = 4 + 4 + 4

x + x + x = 12