C中的0是八进制还是小数?

Gib*_*bbs 61 c literals octal language-lawyer

我读过这个.它是C++中的八进制和Java中的十进制.但没有关于C的描述?

如果0是八进制还是十进制,它会有什么不同吗?这是我的采访者提出的问题.我说没有,我解释说无论是八进制还是十进制,它始终为0.

然后他问为什么它被认为是C++中的八进制和Java中的十进制.我说这是标准.请告诉我C中的内容是什么?会有什么不同吗?为什么它们在不同标准上有所不同?

jua*_*nza 92

它没什么区别,但正式的整数常量0是C中的八进制.从C99和C11标准来看,6.4.4.1整数常量

integer-constant:
    decimal-constant integer-suffix opt
    八进制常量 integer-suffix opt
    十六进制常量 integer-suffix opt

十进制常数:
    非零位数
    十进制恒定

八进制常数:
    0
    八进制常数 八进制数

十六进制常数:
    ...
    ...

  • @juanchopanza"它会有什么不同吗?为什么它们在不同标准上有所不同?" 仍然没有答案.如果您有任何信息,请分享 (3认同)

Yu *_*Hao 60

八.

C11§6.4.4.1整数常数

octal-constant:
    0
    octal-constant octal-digit
Run Code Online (Sandbox Code Playgroud)

C89§3.1.3.2开始就是如此.


Syl*_*oux 29

然后他问为什么它被认为是C++中的八进制和Java中的十进制

为了完整起见,值得一提的是Java规范.从Java语言规范3.10.1:

DecimalNumeral:
    0
    NonZeroDigit Digitsopt
    NonZeroDigit Underscores Digits
Run Code Online (Sandbox Code Playgroud)

十进制数字是单个ASCII数字0,表示整数零,或者由1到9的ASCII数字组成,可选地后跟一个或多个从0到9的ASCII数字,其中散布着下划线,表示正整数.

OctalNumeral:
    0 OctalDigits
    0 Underscores OctalDigits
Run Code Online (Sandbox Code Playgroud)

八进制数字由ASCII数字0后跟一个或多个散布有下划线的ASCII数字0到7组成,并且可以表示正整数,零整数或负整数.

如您所见,裸0视为十进制.而前面的任何(非空)数字序列0被视为八进制.

有趣的是,从那个语法:

  • 0 是小数
  • 但是 00八进制

  • @ user3801433 _"因此它在java中也被视为八进制"_不完全是:从该语法中,一个简单的"0"被认为是"DecimalNumeral".但是`00`被认为是'OctalNumeral` ... (14认同)

sta*_*ify 11

这是一个八进制.参见6.4.4.1 Integer constantsN1570草案部分:

      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
Run Code Online (Sandbox Code Playgroud)

也:

  1. 十进制常量以非零数字开头,由一系列十进制数字组成.八进制常量由前缀0组成,可选地后跟一个数字0到7的序列.十六进制常量由前缀0x或0X后跟一个十进制数字序列和字母a(或A)到f(或F)分别由值10到15组成.


Vla*_*cow 10

从C标准(6.4.4.1整数常量)

octal-constant:
0
octal-constant octal-digit
Run Code Online (Sandbox Code Playgroud)

实际上零没有任何差别,因为零是八进制,十进制和十六进制数的公共数字.只有当一个数字除了单个(前导)零之外还有其他数字时,它才有意义.

考虑到没有十进制,八进制或十六进制这样的整数类型.

  • 即使没有"十六进制"类型,以十六进制表示特定值的常量也可以是与表示十进制相同值的常量不同的类型.例如,如果`int`是16位,那么`0x8000`将是`unsigned int`类型,但`32768`将是`long`类型.我不认为任何这样的问题对于恒定的零是有意义的,但对于更大的值它们肯定是. (3认同)