Plusieurs opérateurs d’incrémentation dans une seule instruction

Dupliquer possible:
Points de comportement et de séquence non définis

Veuillez expliquer le comportement des déclarations suivantes

int b=3; cout<<b++*++b<<endl; 

Comment sera-t-il calculé?

Le comportement ici n’est pas défini. Voir cette question

Devis standard pertinent:

§5/4.1 Between the previous and next sequence point a scalar object shall have its stored value modified at most once by the evaluation of an expression.

Le sharepoint séquence le plus courant est la fin d’une déclaration.

À noter également de la norme:

§5.2.2/8 The order of evaluation of arguments is unspecified.

La norme dit que ceci n’est pas défini. Le compilateur est libre d’évaluer les instructions dans n’importe quel ordre s’il est conforme aux règles de priorité des opérateurs. Cela se traduit par UB:

 b++ * ++b; // b is modified more than once 

Le comportement sera indéfini comme le disent les autres. La sortie dépend de l’implémentation du compilateur.

Mais selon la norme, il devrait être indéfini.

Comme il s’agit d’un comportement indéfini, on ne peut pas dire le résultat final. Le résultat dépend de la mise en œuvre.

Comportement indéfini, Comstackr est libre d’évaluer cette expression dans n’importe quel ordre en raison de la même priorité que les opérateurs. Pensez à utiliser

 (b++)*(++b) 

au lieu