非 Const ポインターを介した const の変更
C では、 const 変数は初期化されると変更できません。ただし、特定のシナリオでは、const 変数が変更されたように見える場合があります。次のコードを考えてみましょう。
const int e = 2;
int* w = (int*)&e; // (1)
*w = 5; // (2)
cout このコードを実行すると、予期しない動作に気づくでしょう:
5
2
(2) で *w が 5 に変更されても、e は元の値 2 を保持します。この一見逆説的な動作は、次の要因から生じています:
- (1 ) const ポインター (w) を逆参照すると、変更が可能になります。
- (2) 変更された値は、w が指すメモリー位置に保管されます。この場合、これは e が保管されているメモリー位置です。
- ただし、コンパイラはコードを最適化し、 e をコンパイル時の定数として扱い、実行時には評価しません。
その結果、 *w が実行時に評価されると、戻り値が返されます。変更された値 (5)。ただし、 e がコンパイル時に評価されるときは、元の値 (2) が使用されます。
この動作は、C では未定義の動作として知られています。 const 変数を直接的または間接的に変更すると、予期しない結果が生じるため、そのような状況では注意が必要です。
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3