Maison > développement back-end > C++ > Pourquoi `mp[10] = mp.size()` génère-t-il `1` en C même si `mp` est vide ?

Pourquoi `mp[10] = mp.size()` génère-t-il `1` en C même si `mp` est vide ?

Linda Hamilton
Libérer: 2024-10-30 20:57:30
original
985 Les gens l'ont consulté

Why Does `mp[10] = mp.size()` Output `1` in C   Even If `mp` is Empty?

L'énigme de l'ordre d'évaluation dans les déclarations d'affectation en C

En C, l'ordre d'évaluation des déclarations d'affectation n'est pas toujours intuitif. Considérez le code suivant :

<code class="cpp">map<int, int> mp;
printf("%d ", mp.size());
mp[10]=mp.size();
printf("%d\n", mp[10]);</code>
Copier après la connexion

Ce code apparemment simple génère étonnamment "0 1", ce qui n'est peut-être pas ce à quoi vous vous attendez.

Pour comprendre pourquoi, nous devons nous plonger dans le spécificités de l’ordre d’évaluation C. Instruction d'affectation, comme spécifié par [expr.ass](https://en.cppreference.com/w/cpp/lingual/operator_assignment) de la norme C, "tous les groupes de droite à gauche". Cela signifie que l'opérande de droite est évalué avant l'opérande de gauche. De plus, la norme C précise que dans une opération d'affectation, "l'affectation est séquencée après le calcul de la valeur des opérandes droit et gauche, et avant le calcul de la valeur de l'expression d'affectation."

Dans notre code, le l'opérande de gauche est mp[10], qui est elle-même une opération d'affectation. L'opérande de droite est mp.size(), qui est évalué à 0 puisque la carte est initialement vide. Ainsi, le code attribue effectivement mp[10] à 0. Cependant, l'opération d'affectation est séquencée avant le calcul de la valeur de mp[10]. Cela signifie que d'abord, la valeur de mp[10] est modifiée, créant une nouvelle entrée dans la carte et la mettant à 0. Ce n'est qu'alors que la valeur de mp[10] est évaluée, révélant l'entrée nouvellement créée avec une valeur de 1. .

Ceci est un exemple clair de l'ordre d'évaluation apparemment inattendu en C . Pour éviter de telles surprises, il est essentiel de connaître les spécifications de la norme et de considérer l'ordre dans lequel les opérations seront exécutées. Dans les cas où l'ordre n'est pas crucial ou où il existe un potentiel de comportement indéfini, des parenthèses explicites peuvent être utilisées pour contrôler l'ordre d'évaluation.

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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal