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>
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!