Maison > développement back-end > C++ > Pourquoi l'attribution d'une valeur de carte en C produit-elle des résultats inattendus ?

Pourquoi l'attribution d'une valeur de carte en C produit-elle des résultats inattendus ?

DDD
Libérer: 2024-10-28 15:10:02
original
582 Les gens l'ont consulté

 Why Does Assigning a Map Value in C   Produce Unexpected Results?

Ordre d'évaluation dans les déclarations d'affectation C

Lors de l'attribution d'une valeur à une carte en C, l'ordre d'évaluation peut conduire à des résultats contre-intuitifs. Considérez le code suivant :

map<int, int> mp;<br>printf("%d ", mp.size());<br>mp[10]=mp.size();<br>printf("%dn", mp[10]);<br>

Ce code imprime 0 puis 1, alors qu'on pourrait s'attendre à 0 et 0. En effet :

  1. De droite à gauche Évaluation : Les opérateurs d'affectation en C s'associent de droite à gauche, ce qui signifie que mp[10] est évalué avant mp.size().
  2. Référence temporaire : Le côté gauche de l'affectation mp[10] crée une référence temporaire à l'élément de carte sous-jacent. Cet élément n'est initialement pas initialisé, donc mp.size() renvoie initialement 0.
  3. Modification de la valeur : L'affectation mp[10]=mp.size() définit la valeur de mp[10 ] à la taille actuelle de la carte, qui est 0.
  4. Extension de la durée de vie de la référence : L'affectation prolonge temporairement la durée de vie de la référence temporaire créée par mp[10].
  5. Évaluation finale : mp[10] pointe maintenant vers l'élément modifié, donc printf("%d", mp[10]); imprime la valeur mise à jour de 1.

Comportement non spécifié

Ce comportement particulier n'est pas spécifié dans la norme C. Cependant, une proposition récente (N4228) cherche à clarifier l'ordre d'évaluation dans de tels cas.

La section [expr.ass]p1 de la proposition révisée indique que :

"L'opérande de droite est séquencé avant l'opérande de gauche. >
Mise à jour

Il est important de noter qu'en C 17, ce comportement a été spécifié dans la norme, selon la révision 3 de la proposition p0145. L'opérande de droite est désormais explicitement séquencé avant l'opérande de gauche dans les instructions d'affectation.

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal