C 整数リテラルの先頭にゼロがあると予期しない結果が生じる場合があるのはなぜですか?

Patricia Arquette
リリース: 2024-11-26 12:48:09
オリジナル
983 人が閲覧しました

Why Do Leading Zeros in C   Integer Literals Sometimes Produce Unexpected Results?

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート