Envisager le C++ suivant la Norme ISO/IEC 14882:2003(E) citation (article 5, paragraphe 4):
Sauf indication contraire, l'ordre de l'évaluation des opérandes de l'individu les opérateurs et les sous-expressions de la personne expressions, et l'ordre dans de quel côté effets, est non spécifié. 53) Entre la précédente et la prochaine séquence, point un scalaire l'objet doit avoir sa valeur stockée modifié plus d'une fois par le l'évaluation d'une expression. En outre, l'état de la valeur doit être accessible uniquement à déterminer la valeur pour être stocké. Les exigences de la présente paragraphe doivent être satisfaites pour chaque admissible de la commande de la les sous-expressions d'une pleine expression; sinon le comportement est indéfini. [Exemple:
i = v[i++]; // the behavior is unspecified i = 7, i++, i++; // i becomes 9 i = ++i + 1; // the behavior is unspecified i = i + 1; // the value of i is incremented
fin de l'exemple]
J'ai été surpris qu' i = ++i + 1
donne une valeur non définie d' i
.
Quelqu'un sait d'un compilateur de mise en œuvre qui ne donne pas d' 2
pour le cas suivant?
int i = 0;
i = ++i + 1;
std::cout << i << std::endl;
Le truc, c'est qu' operator=
a deux arguments. D'abord on est toujours i
de référence.
L'ordre d'évaluation n'a pas d'importance dans ce cas.
Je ne vois pas de problème à l'exception de C++ Standard tabou.
Svp, ne pas considérer de tels cas où l'ordre des arguments est important de l'évaluation. Par exemple, ++i + i
est évidemment pas défini. S'il vous plaît, tenez compte uniquement de mon cas
i = ++i + 1
.
Pourquoi le C++ Standard interdire de telles expressions?