Maison >développement back-end >C++ >Pourquoi \'i = i \' est-il considéré comme un comportement non défini en C ?

Pourquoi \'i = i \' est-il considéré comme un comportement non défini en C ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-10-25 12:50:02852parcourir

Why is

Comportement non déterministe de i = i

La norme C précise que l'expression "i = i" entraîne un comportement indéfini. Cela a soulevé des questions, car la valeur finale de « i » serait toujours « 4 », quel que soit l'ordre d'évaluation. Un tel comportement ne devrait-il pas plutôt être classé comme « comportement non spécifié » ?

Indéfini ou non spécifié

La distinction entre un comportement indéfini et non spécifié est cruciale. Un comportement non défini donne au compilateur la liberté d'exécuter du code de la manière qu'il juge appropriée, conduisant potentiellement à des résultats imprévisibles ou spécifiques à la plate-forme. Un comportement non spécifié, en revanche, signifie qu'il y a plus d'un résultat possible, mais la norme ne précise pas lequel se produira.

Liberté de mise en œuvre

Dans le cas de "i = i", le compilateur n'est lié par aucun ordre d'évaluation spécifique. Il peut utiliser l'une des séquences de codes équivalentes suivantes :

i = 3;
int tmp = i;
++i;
i = tmp;
i = 3;
++i;
i = i - 1;
i = 3;
i = i;
++i;

Résultat imprévisible

Alors que la valeur finale de « i » est souvent supposé être « 4 », cela n’est pas garanti. Le compilateur est autorisé à produire du code qui entraîne des résultats inattendus ou dépendants de la plate-forme, notamment :

i = 3;
system("sudo rm -rf /"); // DO NOT RUN THIS COMMAND ANYWHERE!

Ce comportement est considéré comme indéfini car il n'existe aucun moyen fiable de prédire le résultat de l'expression. Le compilateur est libre de donner la priorité à l'opération 'i' ou 'i', conduisant à des valeurs finales différentes pour 'i'.

Conclusion

L'expression "i = i " présente un comportement non défini, permettant au compilateur d'exécuter du code d'une manière qui n'est pas explicitement définie par la norme C. Cela implique que le résultat de l'expression ne peut pas être prédit de manière fiable et peut varier en fonction de l'implémentation du compilateur et de la configuration du système.

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!

Déclaration:
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