web-dev-qa-db-ja.com

0はCの8進数または10進数ですか?

this と読みました。 C++では8進数、Javaでは10進数です。しかし、Cに関する説明はありませんか?

0が8進数または10進数の場合、違いは生じますか?これは私のインタビュアーからの質問です。私はノーと言い、8進数でも10進数でも常に0であると説明しました。

次に、なぜC++では8進数、Javaでは10進数と見なされるのかと尋ねました。私はそれが標準だと言った。 Cで何を教えてください。違いはありますか?なぜ標準が異なるのですか?

61
GoMan

ほとんど違いはありませんが、正式には整数定数0はCでは8進数です。C99およびC11標準では、6.4.4.1整数定数

整数定数
decimal-constant整数サフィックスopt
octal-constant整数サフィックスopt
hexadecimal-constantinteger-suffixopt

decimal-constant
非ゼロ桁
decimal-constantdigit

8進定数
0
octal-constantoctal-digit

16進定数
...
...

92
juanchopanza

オクタル。

C11§6.4.4.1整数定数

octal-constant:
    0
    octal-constant octal-digit

C89§3.1.3.2 であるため、これは事実です。

60
Yu Hao

それから彼は、なぜC++では8進数、Javaでは10進数と見なされるのかと尋ねました

完全を期すために、Java仕様にも言及する価値があります。 Java言語仕様3.10.1 から:

DecimalNumeral:
    0
    NonZeroDigit Digitsopt
    NonZeroDigit Underscores Digits

10進数は、整数のゼロを表す単一のASCII数字0、または1〜9のASCII数字で構成され、オプションで1つ以上のASCIIが続きます。アンダースコアが点在する0から9までの_数字。正の整数を表します。

OctalNumeral:
    0 OctalDigits
    0 Underscores OctalDigits

8進数は、ASCII数字0とそれに続くアンダースコアが散在する1つ以上のASCII数字0から7で構成され、正、ゼロ、または負の整数を表すことができます。

ご覧のとおり、裸の0decimalと見なされます。一方、0が前にある(空でない)数字のシーケンスは、octalと見なされます。

興味深いことに、その文法から:

  • 0は10進数です
  • but00は8進数です
29
Sylvain Leroux

8進数です。セクション6.4.4.1 Integer constants N1570ドラフトの:

      integer-constant:
            decimal-constant integer-suffixopt
            octal-constant integer-suffixopt
            hexadecimal-constant integer-suffixopt
      decimal-constant:
            nonzero-digit
            decimal-constant digit
      octal-constant:
            0
            octal-constant octal-digit
      hexadecimal-constant:
            hexadecimal-prefix hexadecimal-digit
            hexadecimal-constant hexadecimal-digit
      hexadecimal-prefix: one of
            0x   0X
      nonzero-digit: one of
            1   2   3   4   5   6   7   8   9
      octal-digit: one of
            0   1   2   3   4   5   6   7
      hexadecimal-digit: one of
            0   1   2   3   4   5   6   7   8   9
            a   b   c   d   e   f
            A   B   C   D   E   F
      integer-suffix:
            unsigned-suffix long-suffixopt
            unsigned-suffix long-long-suffix
            long-suffix unsigned-suffixopt
            long-long-suffix unsigned-suffixopt
      unsigned-suffix: one of
            u   U
      long-suffix: one of
            l   L
      long-long-suffix: one of
            ll   LL

また:

  1. 10進定数はゼロ以外の数字で始まり、一連の10進数字で構成されます。 8進定数は、接頭辞0で構成され、オプションでその後に0〜7の数字のシーケンスのみが続きます。 16進定数は、プレフィックス0xまたは0Xの後に10進数のシーケンスと、それぞれ値10から15の文字a(またはA)からf(またはF)が続きます。
11
starrify

C標準から(6.4.4.1整数定数)

octal-constant:
0
octal-constant octal-digit

実際、ゼロは8進数、10進数、16進数の一般的な数字であるため、ゼロに違いはありません。数字に単一の(先頭の)ゼロ以外の桁がある場合にのみ意味があります。

10進数、8進数、16進数などの整数型がないことを考慮してください。

10