独自のイニシャライザとして使用される初期化されていない変数の動作
C/C のこのコードは、その動作について疑問を引き起こします。
int i = i;
初期化されていない変数が存在するにもかかわらず、このコードは警告やエラーなしでコンパイルされます。なぜこれが起こるのでしょうか?また、その動作について標準では何と記載されていますか?
不定の値と実装の依存関係
i のような変数を使用してそれ自体を初期化すると、不定の値が含まれています。この値は、未指定の値またはトラップ表現のいずれかになります。未指定の値は標準では定義されておらず、実装に依存します。トラップ表現は、実装でサポートされている場合、使用時に未定義の動作をトリガーします。
パディングによる未定義の動作
実装がパディング ビットを整数型で割り当てている場合、および不定値はトラップ表現であり、それを使用すると未定義の動作が発生します。これは、トラップ表現にアクセスすると予期しない結果が生じるためです。
パディングなしの未指定の値
ただし、実装がパディング ビットを整数で割り当てない場合、不定の値は次のようになります。単に不特定です。この場合、未定義の動作はなく、i の正確な値は実装によって決定されます。
アドレスが取得された場合の未定義の動作
さらに、この動作はC11 標準で述べられているように、アドレスが取得されていない場合でも未定義になります:
"左辺値がレジスタ ストレージ クラスで宣言された可能性がある自動ストレージ期間のオブジェクト (アドレスが取得されたことがない)、そのオブジェクトは初期化されていないため、動作は未定義です。
したがって、このコードの動作は実装です。 -依存性があり、さまざまな要因に応じて未定義になる可能性があります。
以上が`int i = i;` が未定義の動作でコンパイルされるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。