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

时间:2014-10-29 08:02:03

标签: c language-lawyer literals octal

我看过this。它是C ++中的八进制和Java中的十进制。但没有关于C的描述?

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

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

6 个答案:

答案 0 :(得分:92)

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

  

整数常数
  十进制常量 整数后缀 opt
  八进制常量 整数后缀 opt
  十六进制常量 整数后缀 opt

     

十进制常数
  非零位数
  十进制常量 数字

     

八进制常数
  0
  八进制常量 八进制数

     

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

答案 1 :(得分:59)

八路。

  

C11§6.4.4.1整数常量

octal-constant:
    0
    octal-constant octal-digit

C89 §3.1.3.2以来就是如此。

答案 2 :(得分:29)

  

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

为了完整起见,值得一提的是Java规范。来自Java Language Specification 3.10.1

  
DecimalNumeral:
    0
    NonZeroDigit Digitsopt
    NonZeroDigit Underscores Digits
     

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

  
OctalNumeral:
    0 OctalDigits
    0 Underscores OctalDigits
     

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

如您所见,裸0被视为十进制。 而以0开头的任何(非空)数字序列都被视为 octal

有趣的是,从那个语法:

  • 0是十进制
  • 00是八进制

答案 3 :(得分:11)

它是八进制的。请参阅N1570草案的6.4.4.1 Integer constants部分:

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

答案 4 :(得分:10)

从C标准(6.4.4.1整数常量)

octal-constant:
0
octal-constant octal-digit

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

考虑到没有十进制,八进制或十六进制等整数类型。

答案 5 :(得分:-2)

我认为这取决于编译器的实现。我们必须看到源代码,以确定它是否标记" 0"常数为八进制或不是。我可以用这种方式定义非八进制的原因:Octals有" 0"字首。但是没有前缀。如果常数是00,则它是八进制 - "八进制零" :)