変数の初期化と未定義の動作
C では、変数を単独で初期化することは有効ですか?次のコード例では、この珍しい構文を詳しく説明します。
<code class="cpp">int main() { int a = 3; { int a = a; // Initialization by itself } }</code>
一見すると、このコードは「a=3nnew a = 3nchanged a = 5nold a = 3n」を出力すると予想されるかもしれません。ただし、実際には、出力の 2 行目に「new a = 0」が含まれます。この動作は直観に反しているように見え、なぜ初期化構文が "int a = a;" なのかという疑問が生じます。 valid at all?
構文の有効性
変数の宣言が初期化子よりも前にあるため、構文自体は有効です。これは、値が設定される前に変数名にアクセスできることを意味します。これにより、次のような異常な初期化が可能になります。
<code class="cpp">void *p = &p;</code>
値が正しくない場合でも、変数の名前が正当に使用されます。
未定義の動作
構文的には正しいですが、変数を単独で初期化する動作はまだ未定義です。初期化されていない変数を使用しようとすると、未定義の動作が発生します。コンパイラは、このような単純なケースに対して警告を発行することがあります。
この特定の例では、内部スコープ内の初期化されていない変数 "a" には、参照される前に値 0 が割り当てられます。したがって、2 番目の出力には「new a = 0」と表示されます。
未定義の動作が必ずしも直ちにエラーやクラッシュにつながるわけではないことに注意することが重要です。コンパイラーはそのようなコードの結果を保証できないため、予測不可能で誤った結果が生じる可能性があります。
以上がC で変数をそれ自体で初期化することは有効ですか?またその影響は何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。