std::map<int, int> my_map;
my_map[0] = my_map.size();
Alors, est-ce que my_map[0]
sea 0
o 1
ou indéfini ?
std::map<int, int> my_map;
my_map[0] = my_map.size();
Alors, est-ce que my_map[0]
sea 0
o 1
ou indéfini ?
Il n'y a aucune garantie, sauf si votre compilateur fournit des garanties. La norme C++ ne le fait pas.
Si vous avez besoin my_map.operator [](0)
évalué d'abord, puis écrit :
int& m0 = my_map[0];
m0 = my_map.size();
Si vous avez besoin de la my_map.size()
évalué d'abord, puis écrit :
int s = my_map.size();
my_map[0] = s;
Il y a non point de séquence ici l'ordre d'évaluation n'est donc pas spécifié (ou, en jargon C++11, les deux expressions sont séquençage indéterminé ). La valeur de my_map[0]
es 0
o 1
en fonction de la mise en œuvre.
my_map[0]
augmentera la taille si elle est évaluée en premier, ce qui entraînera une augmentation de la taille de l'image. my_map.size()
évaluer évaluer 1
. my_map[0]
sera alors 1
.my_map.size()
est évaluée en premier, puis la valeur de my_map[0]
sera 0
.Maintenant, comment faire pour que le comportement ci-dessus se produise bien défini ? Il faut introduire un point de séquence, c'est-à-dire forcer une expression à être séquencée avant l'autre ; pour un comportement comme le premier,
int& val = my_map[0];
val = my_map.size();
... ou, pour un comportement comme le second,
int sz = my_map.size();
my_map[0] = sz;
Ne manquez pas d'attribuer un "upvote" à Oo Tiib pour avoir été le premier à montrer comment introduire le séquençage pour les expressions :-)
Votre
my_map[0] = my_map.size();
est équivalent à
my_map.operator [](0) = my_map.size();
l'opérateur d'affectation étant l'affectation intégrée pour int
.
Il n'est pas précisé quel côté de l'affectation intégrée est évalué en premier. C'est pourquoi il n'est pas précisé si c'est 0 ou 1 qui sera attribué.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.