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

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

如果0是八进制还是十进制,会有什么区别? 这是面试官提出的问题。 我说不,我解释说,无论是八进制还是十进制都是0。

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

它没有什么区别,但在forms上,整数常量0是C中的八进制数。根据C99和C11标准, 6.4.4.1整型常量

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

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

八进制常数
0
八进制常数 八进制数字

hex常量

八。

C11§6.4.4.1整型常量

 octal-constant: 0 octal-constant octal-digit 

从C89§3.1.3.2开始 ,情况就是如此。

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

为了完整起见,值得一提的是Java规范。 从Java语言规范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任何(非空)数字序列被认为是八进制的

有趣的是,从这个语法来看:

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

这是一个八进制。 请参见第6.4.4.1 Integer constants节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 abcdef ABCDEF 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的序列。 hex常量由前缀0x或0X组成,后跟一串十进制数字和字母a(或A)到f(或F),其值分别为10到15。

从C标准(6.4.4.1整型常量)

 octal-constant: 0 octal-constant octal-digit 

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

考虑到不存在十进制,八进制或hex等整数types。

我认为这取决于编译器的实现。 我们必须看到源代码来确定它是否将“0”常量标记为八进制。 我可以这样定义非八进制的原因:八进制的前缀是“0”。 但是没有前缀。 如果常数是00,那么它是八进制 – “八进制零”:)