初期化されていない変数の自己初期化: 危険性と標準
以下の C/C コード スニペット:
int i = i;
は、初期化されていない変数を使用して自身を初期化するため、開発者の間で懸念を引き起こしています。最近のコンパイラは警告なしでこのコードを受け入れ、その合法性と標準で定義されている根本的な動作について疑問が生じます。
コンパイラの受け入れと標準
C11 標準によると、初期化されていない変数には不定の値があり、これは未指定の値またはトラップ表現である可能性があります。不定の値がたまたまトラップ値である状況では、実装が整数のパディング ビットをサポートしている場合、それを使用すると未定義の動作が発生する可能性があります。
ただし、実装がパディングを使用しない場合、値は未指定です。
未定義のシナリオ
変数のアドレスが取得されない場合、初期化されていない変数を自己初期化に使用する動作はさらに予測不能になります。 。 C11 標準のセクション 6.3.2.1p2 では、レジスタ ストレージ クラスで宣言された可能性がある自動ストレージ期間のオブジェクトについては、そのような使用法が定義されていないことを明確にしています。
影響
コンパイラーは受け入れられますが、初期化されていない変数を自己初期化に使用することは推奨されません。実装によっては、誤った動作や未定義の動作が発生する可能性があり、コードの信頼性が低くなります。これらの落とし穴を避けるために、変数は常に明示的に初期化してください。
以上がC/C における初期化されていない変数の自己初期化は未定義の動作ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。