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

C で先頭にゼロが付加された数値が予期しない動作をするのはなぜですか?

Linda Hamilton
リリース: 2024-12-02 22:43:12
オリジナル
399 人が閲覧しました

Why Do Zero-Prepended Numbers Behave Unexpectedly in C  ?

先頭にゼロが付加された数値の特異な動作を理解する

C などの特定のプログラミング言語では、先頭にゼロが付加された数値が予期しない動作を示すことがよく観察されます。これらの癖を理解するために、提示した具体的なシナリオを詳しく見てみましょう。

次のコードの抜粋を考えてみましょう:

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...
ログイン後にコピー

ゼロ桁と 8 進数の解釈

C では、整数リテラル10 進数、8 進数、または 16 進数で指定できます基地。先頭にゼロが付加された整数は、通常、リテラルが 16 進数を示す 0x または 0X で始まる場合を除き、8 進数リテラルとして解釈されます。

この例では、00016 は 8 進数リテラルとして解釈され、i == となります。 14. 8 進数は、0 ~ 7 の数字を使用して値を表します。先頭のゼロはリテラルの値に影響しません。

同様に、05016 も 8 進数リテラルとして解釈され、各桁に 8 の適切な累乗を乗算することで 10 進数に変換できます。これにより、 i が得られます。 == 2574.

先行ゼロと 16 進数解釈

ただし、リテラルが 0x または 0X で始まる場合は、16 進リテラルとして解釈されます。 16 進数は、0 ~ 9 の数字と A ~ F (または a ~ f) の文字を使用して値を表します。

この例では、0x16 は値 22 を表す 16 進リテラルとして解釈されます。

8 進数および構文エラー

C 標準によれば、8 および9 は有効な 8 進数ではありません。したがって、08 は無効な 8 進リテラルであり、コンパイル中に構文エラーが発生します。

結論

先頭にゼロが付加された数字で観察された問題は、C で整数リテラルを解釈するための特定の規則に起因しています。 。これらのルールを理解することにより (つまり、特に指定がない限り、先頭にゼロが付加された整数を 8 進リテラルとして解釈すること)、エラーを回避し、整数値を正しく処理できます。

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

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