"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > Pourquoi l'affectation à un élément de carte en C++ entraîne-t-elle une taille inattendue ?

Pourquoi l'affectation à un élément de carte en C++ entraîne-t-elle une taille inattendue ?

Publié le 2024-11-04
Parcourir:893

 Why Does Assigning to a Map Element in C   Result in an Unexpected Size?

Ordre d'évaluation des instructions d'affectation en C

Un résultat déroutant peut être obtenu lors de l'attribution d'une valeur à une carte :

map mp;
printf("%d ", mp.size());
mp[10] = mp.size();
printf("%d\n", mp[10]);

Ce code s'affiche :

0 1

Ce résultat peut sembler contre-intuitif, car on pourrait s'y attendre la taille de la carte doit être 1 après l'affectation. Cependant, l'ordre d'évaluation de l'instruction d'affectation joue ici un rôle crucial.

Le côté gauche de l'affectation mp[10] renvoie une référence à la valeur sous-jacente de l'élément de carte. Simultanément, cette action crée une nouvelle valeur pour l'élément mp[10]. Ce n'est qu'après cette opération que le côté droit est évalué, en utilisant la taille nouvellement calculée de la carte.

Ce comportement n'est pas explicitement indiqué dans la norme C mais relève d'un comportement non spécifié. Une proposition récente, N4228, vise à affiner l'ordre des règles d'évaluation pour spécifier de tels cas.

La section pertinente du projet de norme C 11 (1.9) stipule que les évaluations des sous-expressions d'expressions individuelles ne sont généralement pas séquencées. Cependant, les appels de fonction (tels que l'opérateur [] et size()) sont séquencés avant l'exécution du corps de la fonction appelée.

Par conséquent, l'opérande droit de l'expression d'affectation est séquencé après l'opérande gauche, ce qui entraîne le comportement observé. Cela signifie que l'ordre d'évaluation est le suivant :

  1. Évaluez l'opérande de droite : mp.size()
  2. Créez la valeur pour l'opérande de gauche : mp[10]
  3. Attribuer la valeur de l'opérande droit à l'opérande gauche

Une mise à jour du standard C devrait spécifier ce comportement, indiquant clairement que l'opérande droit d'une expression d'affectation est séquencé avant l'opérande de gauche.

Dernier tutoriel Plus>

Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.

Copyright© 2022 湘ICP备2022001581号-3