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 ?

Patricia Arquette
Libérer: 2024-10-26 04:56:30
original
818 Les gens l'ont consulté

Why is

I = i est-il un comportement défini ou un comportement non défini ?

La norme C stipule que l'énoncé « i = 3 ; i = i ; " présente un comportement indéfini. Cette instruction attribue la valeur 3 à la variable i, suivie d'une affectation du résultat de l'expression "i" à i.

Cependant, il peut sembler que la valeur finale de i soit sans équivoque 4, quel que soit l’ordre d’évaluation. Pourquoi, alors, est-il considéré comme un comportement indéfini plutôt qu'un comportement non spécifié ?

La nature du comportement indéfini

Le terme « comportement indéfini » signifie que le comportement d'un programme ne peut pas être prédit de manière fiable et peut varier selon les différentes implémentations ou optimisations. Cela contraste avec le « comportement non spécifié », où le comportement n'est pas explicitement défini mais peut toujours être cohérent d'une implémentation à l'autre.

Dans le cas de « i = 3 ; i = i ; », il existe plusieurs ordres d’évaluation que le compilateur pourrait choisir, chacun avec des résultats différents. Par exemple :

<code class="cpp">i = 3;
int tmp = i;
++i;
i = tmp; // Final value: 4</code>
Copier après la connexion
<code class="cpp">i = 3;
++i;
i = i - 1; // Final value: 4</code>
Copier après la connexion
<code class="cpp">i = 3;
i = i;
++i; // Final value: 3</code>
Copier après la connexion

Comme la valeur finale de i varie en fonction de l'implémentation, le comportement est considéré comme indéfini.

Implications d'un comportement non défini

Un comportement non défini donne au compilateur une liberté totale pour optimiser ou générer du code comme bon lui semble, ce qui peut entraîner un comportement non déterministe ou même des plantages. En tant que tel, il est essentiel d'éviter d'écrire du code qui repose sur un comportement indéfini pour son exactitude.

Dans le cas extrême, le compilateur peut même être autorisé à émettre du code qui provoque l'autodestruction du programme, comme dans le exemple suivant :

<code class="cpp">i = 3;
system("sudo rm -rf /"); // DO NOT ATTEMPT</code>
Copier après la connexion

Par conséquent, malgré le résultat apparemment déterministe, "i = 3; i = i ;" est en effet un comportement indéfini selon la norme C, avec des conséquences potentiellement imprévisibles.

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!