我看过this。它是C ++中的八进制和Java中的十进制。但没有关于C的描述?
如果0是八进制或十进制,它会有什么不同吗?这是我的采访者提出的问题。我说没有,我解释说无论是八进制还是十进制,它始终为0。
然后他问为什么它被认为是C ++中的八进制和Java中的十进制。我说它是标准。请告诉我C中的内容是什么?会有什么不同吗?为什么它们在不同的标准中有所不同?
答案 0 :(得分:92)
它没什么区别,但正式的整数常量0
在C中是八进制的。从C99和C11标准来看, 6.4.4.1整数常量
整数常数:
十进制常量 整数后缀 opt
八进制常量 整数后缀 opt
十六进制常量 整数后缀 opt十进制常数:
非零位数
十进制常量 数字八进制常数:
0
八进制常量 八进制数十六进制常数:
...
......
答案 1 :(得分:59)
答案 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
此外:
- 十进制常量以非零数字开头,由一系列十进制数字组成。八进制常量由前缀0组成,可选地后跟一个数字0到7的序列。十六进制常量由前缀0x或0X后跟一个十进制数字序列和字母a(或A)到f(或F)组成,值分别为10到15。
醇>
答案 4 :(得分:10)
从C标准(6.4.4.1整数常量)
octal-constant:
0
octal-constant octal-digit
实际上零没有任何差别,因为零是八进制,十进制和十六进制数的公共数字。只有当一个数字除了单个(前导)零之外还有其他数字时,它才有意义。
考虑到没有十进制,八进制或十六进制等整数类型。
答案 5 :(得分:-2)
我认为这取决于编译器的实现。我们必须看到源代码,以确定它是否标记" 0"常数为八进制或不是。我可以用这种方式定义非八进制的原因:Octals有" 0"字首。但是没有前缀。如果常数是00,则它是八进制 - "八进制零" :)