初期化されていない変数の初期化: C のパラドックス
C では、それ自体を介してのみ新しい変数を初期化することが有効であると見なされるのは直観に反しているように思えるかもしれません。 。この概念を理解するために、次のコード スニペットを分析してみましょう:
<code class="cpp">int a = 3; { int a = a; // Initializing 'a' with itself cout << "new a = " << a << "\n"; a = 5; cout << "a = " << a << "\n"; } cout << "old a = " << a << "\n";</code>
一見すると、スニペットは次のように出力されると思われるかもしれません:
a=3 new a = 3 changed a = 5 old a = 3
しかし、多くの場合、2 行目は " を返します。新しい a = 0。」なぜこれが起こるのかを理解するには、C の変数初期化の複雑さを詳しく調べる必要があります。
構文的には、'a' の宣言が内部スコープ内での初期化に先行するため、コードは有効です。 C では、変数の名前は、変数の宣言後、値が割り当てられる前であっても使用できるようになります。これにより、スニペットで使用されているような自己参照の初期化が可能になります。
ただし、動作の観点から見ると、初期化されていない変数を使用すると、未定義の動作が発生します。コンパイラは警告を発行する場合がありますが、変数初期化のプログラム フローの分析は複雑であるため、そのような発生にフラグを立てる義務はありません。
スニペットでは、'a' は外側のスコープ内で 3 で初期化されます。内側のスコープに入ると、外側のスコープの変数と同じ名前で新しい「a」が宣言されます。この内部の「a」は自己初期化されるため、その値は未定義になります。内部スコープ内の内部 'a' に 5 を代入しても、外側の 'a' には影響しません。
したがって、変数を単独で初期化することは構文的には有効ですが、次のような可能性があるため、注意して使用する必要があります。未定義の動作。
以上が変数をそれ自体で初期化すると、C で未定義の動作が発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。