非 const ポインターを使用して「const」変数を変更すると、機能しているように見えても、実際にはその値が変更されないのはなぜですか?

Mary-Kate Olsen
リリース: 2024-10-28 08:35:02
オリジナル
155 人が閲覧しました

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

非 Const ポインターを使用した const の変更

C では、 const 変数は、一度初期化されると変更できません。ただし、特定のシナリオでは、const 変数が変更されたように見える場合があります。次のコードを考えてみましょう:

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

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

cout << *w << endl;          // (3)
cout << e << endl;             // (4)</code>
ログイン後にコピー

このコードを実行すると、予期せぬ動作に気づくでしょう:

5
2
ログイン後にコピー

(2) で *w が 5 に変更されたにもかかわらず、 e はまだ元の値 2 を保持しています。この一見矛盾した動作は、次の要因から生じています:

  • (1) const ポインター (w) の逆参照により変更が可能になります。
  • (2) ) 変更された値は、w が指すメモリ位置に格納されます。この場合、これは e が格納されているメモリ位置です。
  • ただし、コンパイラは e をコンパイル時の定数として扱い、コードを最適化します。

その結果、*w が実行時に評価されると、変更された値 (5) が返されます。ただし、 e がコンパイル時に評価されるときは、元の値 (2) が使用されます。

この動作は、C では未定義の動作として知られています。 const 変数を直接的または間接的に変更すると、予期しない結果が生じるため、そのような状況では注意が必要です。

以上が非 const ポインターを使用して「const」変数を変更すると、機能しているように見えても、実際にはその値が変更されないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!