Maison  >  Article  >  développement back-end  >  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 ?

Patricia Arquette
Patricia Arquetteoriginal
2024-10-26 04:56:30819parcourir

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>
<code class="cpp">i = 3;
++i;
i = i - 1; // Final value: 4</code>
<code class="cpp">i = 3;
i = i;
++i; // Final value: 3</code>

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>

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!

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