ホームページ >バックエンド開発 >C++ >C で接頭辞ゼロの数値が予期しない動作をするのはなぜですか?

C で接頭辞ゼロの数値が予期しない動作をするのはなぜですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-12-07 14:50:17505ブラウズ

Why Do Zero-Prefixed Numbers Behave Unexpectedly in C  ?

ゼロの接頭辞が付いている数値とその重要性を理解する

プログラミングの領域では、接頭辞がゼロの数値は興味深い動作を示すことがあります。 Visual Studio 2013 の例を使用して、詳細を詳しく見てみましょう。

次のコード スニペットを考えてみましょう:

int i = 07;     // i == 7
int i = 16;     // i == 16
int i = 00016;  // i == 14, why?
int i = 05016;  // i == 2574, wow )
int i = 08;     // compile error, compiler expects octal number...

接頭辞ゼロの数値の特別な処理

コンパイラは、接頭辞ゼロの数値を、 context:

  • 10 進数 (Base 10): 接頭辞が 0 の数値が 0 ~ 7 の数字のみで構成される場合、その数値は 10 進数として解釈されます。たとえば、07 は 7 に相当します。
  • 8 進数 (Base 8): 接頭辞ゼロの数値に数字 8 または 9 が含まれる場合、その数値は 8 進数とみなされます。ただし、これは C 標準に従って無効な使用法であることに注意してください。
  • 16 進数 (Base 16): 0x または 0X で始まるゼロ接頭辞付きの数値は、16 進数として解釈されます。

00016 および05016

代入 int i = 00016;これは、C 標準に従って無効であっても、コンパイラは先頭のゼロを余分な 8 進数として扱うため、i == 14 に解決されます。

同様に、int i = 05016;コンパイラーは次のように解釈するため、 i == 2574 が返されます。

  • 050 は 8 進数の 50 として扱われます。
  • 16 は 10 進数の 16 として扱われます。
  • 結果(50 * 8) 16 = として計算されます。 2574.

08 によるコンパイル エラー

0 で始まり、0 ~ 7 以外の数字が続く整数リテラル (08 など) はコンパイルをトリガーします。コンパイラはこれが 8 進数であると想定していますが、8 は有効な 8 進数ではないため、エラーが発生します。数字。

以上がC で接頭辞ゼロの数値が予期しない動作をするのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。