Maison >développement back-end >C++ >Pourquoi la modification d'une variable « const » via un pointeur non-const semble-t-elle fonctionner, mais ne change-t-elle pas réellement sa valeur ?

Pourquoi la modification d'une variable « const » via un pointeur non-const semble-t-elle fonctionner, mais ne change-t-elle pas réellement sa valeur ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-10-28 08:35:02207parcourir

Why Does Modifying a `const` Variable Through a Non-Const Pointer Seem to Work, but Doesn't Actually Change Its Value?

Modifier une const via un pointeur non-const

En C , une variable const ne peut pas être modifiée une fois initialisée. Cependant, dans certains scénarios, il peut sembler qu'une variable const ait été modifiée. Considérez le code suivant :

<code class="cpp">const int e = 2;

int* w = (int*)&e;        // (1)
*w = 5;                   // (2)

cout << *w << endl;          // (3)
cout << e << endl;             // (4)</code>

Si vous exécutez ce code, vous remarquerez un comportement inattendu :

5
2

Même si *w a été modifié en 5 dans (2), e conserve toujours sa valeur d'origine de 2. Ce comportement apparemment paradoxal provient des facteurs suivants :

  • (1) Le déréférencement d'un pointeur const (w) permet une modification.
  • (2 ) La valeur modifiée est stockée dans l'emplacement mémoire pointé par w, qui dans ce cas est l'emplacement mémoire où e est stocké.
  • Cependant, le compilateur optimise le code, traitant e comme une constante de compilation. et ne pas l'évaluer au moment de l'exécution.

Par conséquent, lorsque *w est évalué au moment de l'exécution, il renvoie la valeur modifiée (5). Cependant, lorsque e est évalué au moment de la compilation, sa valeur d'origine (2) est utilisée.

Ce comportement est connu sous le nom de comportement non défini en C . La modification d'une variable const entraîne directement ou indirectement des conséquences imprévisibles, et la prudence doit être exercée dans de telles situations.

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