C の数値異常の解明 : 先行ゼロの重要性
C プログラミングの領域における、先行ゼロを含む整数リテラルの動作時々困惑するかもしれません。この興味深い問題を掘り下げて、その基礎となる仕組みを明らかにしましょう。
C 標準では、整数リテラルを小数点や指数のない数字のシーケンスとして定義します。リテラルの前に 0 を付けると 8 進数 (基数 8) を示し、接頭辞がない場合は 10 進数 (基数 10) を示します。
ただし、次のコード スニペットを考慮してください。
int i = 07; // i == 7 int i = 16; // i == 16 int i = 00016; // i == 14, why? int i = 05016; // i == 2574, wow )
最初の例では、07 が 8 進数値として解釈されるため、i は値 7 に設定されます (8 * 0 7 = 7)。これは、接頭辞のない先行ゼロを 8 進数として解釈する C の規則と一致しています。
ただし、後続の例では、先行ゼロが 10 進数の前に表示されるため、疑問が生じます。標準によれば、これらのリテラルは 8 進数として受け入れられるべきではありません。では、ここで何が起こっているのでしょうか?
その答えは、「オクタル抑制」として知られるコンパイラの最適化にあります。コンパイラーは、先頭のゼロとそれに続く 10 進数を検出すると、8 進数の解釈を抑制し、代わりにリテラルを 10 進数として扱います。これは、00016 が 14 として評価され、05016 が 2574 として評価される理由を説明しています。
一方、08 は、8 進リテラルに数字 8 または 9 を含めることができないという標準の規則に違反するため、コンパイル エラーを引き起こします。コンパイラは、有効な 8 進数ですが、無効な文字が検出され、エラーが発生します。
以上がC 整数リテラルの先頭にゼロがあると予期しない結果が生じる場合があるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。