Maison > développement back-end > C++ > le corps du texte

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

Mary-Kate Olsen
Libérer: 2024-10-25 12:50:02
original
776 Les gens l'ont consulté

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;
Copier après la connexion
i = 3;
++i;
i = i - 1;
Copier après la connexion
i = 3;
i = i;
++i;
Copier après la connexion

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!
Copier après la connexion

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!

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
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!