Ordre d'évaluation dans les déclarations d'affectation en C
Dans l'extrait de code donné :
map< int, int> mp;<br>printf("%d ", mp.size());<br>mp[10]=mp.size();<br>printf("%dn", mp[10]);<br>
le résultat apparemment contre-intuitif de "0 1" découle de l'ordre non spécifié d'évaluation des sous-expressions dans les affectations.
Conformément à la norme C , l'ordre d'évaluation dans les instructions d'affectation n'est pas défini. Cependant, le comportement est le suivant :
Par conséquent, dans l'extrait de code, mp.size() est évalué à 0 et attribué à mp[10]. Ensuite, mp[10] est à nouveau évalué, qui renvoie désormais la valeur qui lui a été attribuée (1).
Bien qu'il ne soit pas spécifié dans la norme C actuelle, ce comportement a été abordé dans une proposition récente ( N4228) :
N4228 propose d'affiner l'ordre des règles d'évaluation pour le rendre bien défini pour certains cas, dont celui ci-dessus. Selon la proposition, l'opérande droit d'une affectation est séquencé avant l'opérande gauche.
Cela signifie qu'en C 17 et au-delà, le comportement de l'extrait de code sera probablement bien défini et entraînera un sortie de "1 1."
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!