ホームページ  >  記事  >  バックエンド開発  >  非 const ポインターでは実際の値の変更が可能であるにもかかわらず、変更された定数変数がコンパイル時に元の値を保持するのはなぜですか?

非 const ポインターでは実際の値の変更が可能であるにもかかわらず、変更された定数変数がコンパイル時に元の値を保持するのはなぜですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-01 19:33:02469ブラウズ

Why does a modified constant variable retain its original value at compile time, even though a non-const pointer allows for modification of its actual value?

非定数ポインターによる定数の変更

指定されたコードでは、定数変数 e は 2 に初期化されます。次に、const ポインタ w が e のアドレスを指すようにキャストされ、変数の const 性が暗黙的に削除されます。 w を逆参照し、それに新しい値を代入すると、e のアドレスの値が 2 から 5 に変更されます。

ただし、*w と e の値が出力されると、それらは異なって表示されます。

<code class="cpp">cout << *w << endl; // Outputs 5
cout << e << endl; // Outputs 2</code>

この動作は、*w と e が評価されるさまざまな方法を考慮することで説明できます:

  • *w は実行時に評価されます:コンパイラは *w が非 const ポインタであることを認識し、w が指すアドレスの値を動的に取得します。そのアドレスの値が 5 に変更されているため、*w は正しく 5 を出力します。
  • e はコンパイル時の定数として扱われます: コンパイラーは e が定数変数であると認識します。そしてコンパイル時にその値を評価します。 e の値はコンパイル時に変更されていないため、コンパイラーはそれを 2 として扱い続けます。

したがって、値の違いは *w と e の異なる評価時間から生じます。 e のアドレスの値が変更されたにもかかわらず、定数変数自体はコンパイル時に変更されません。ただし、非定数ポインター w では、それが指すアドレスの値を変更できるため、*w.

の出力は 5 になります。

以上が非 const ポインターでは実際の値の変更が可能であるにもかかわらず、変更された定数変数がコンパイル時に元の値を保持するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。