0是十进制文字还是八进制文字?


329

零永远是零,所以没关系。但是在最近与一位朋友的讨论中,他说八进制立即数在今天几乎未使用。然后我发现实际上我的代码几乎所有整数文字都是八进制的,即0

0根据C ++语法,八进制文字是否正确?标准怎么说?

我知道的唯一真正用途是用于UNIX文件权限。


6
Java是否一样?
菲利普

80
+1提出完全不相关的问题并获得大量赞成票:-)
Kerrek SB 2011年

64
我认为即时执行SO代表的方法不是一个深刻的问题,而是一个奇特的问题,其答案将使您对水冷却器产生怀疑:)
Josh

4
很棒的问题:)我在Java语言规范中进行了查找,在Java中为十进制。该规范甚至包含以下引号:请注意,八进制数字始终由两个或多个数字组成;始终将0视为十进制数字-在实际中并不重要,因为数字0、00和0x0都表示完全相同的整数值。
Tobias Ritzau'9

14
我几乎想发布一个答案,说“是的,0是十进制文字或八进制文字”。
Keith Thompson

Answers:


296

是的,0是C ++中的八进制文字

根据C ++标准:

2.14.2整数文字[lex.icon]

integer-literal:  
    decimal-literal integer-suffixopt  
    octal-literal integer-suffixopt  
    hexadecimal-literal integer-suffixopt  
decimal-literal:  
    nonzero-digit  
    decimal-literal digit  
octal-literal:  
    0                           <--------------------<Here>
    octal-literal octal-digit

39
另一个重要的一点是,十进制字面量是一个非零数字,后跟零个或多个数字,因此没有歧义。
CB Bailey

3
@MSalters:对于您的版本,您必须另外指定首选项:如果两者 octal-literaldecimal-literal都是字节模式的可能解释,请选择octal-literal。官方标准的措辞没有这个问题。
马丁·索伊卡

23
@MSalters:您仍然不能使用十进制字面量的数字,它必须是一个零或一个非零数字,后跟任何数字,否则每个八进制文字都可以解释为十进制文字。现在,我可以看到编译错误:ERROR: 0 is ambiguous, could be octal zero or could be decimal zero. Consider using (1 - 1) to disambiguate
CB Bailey

3
@MSalters在您的示例中,0123既可以匹配八进制字面量,也可以匹配十进制字面量,但是两种方式都有不同的含义。
蓬松的

5
@CharlesBailey-FTFY,1仍为八进制;所有-PERROR: 0 is ambiguous, could be octal zero or could be decimal zero. Consider using (8 - 8) to disambiguate
twalberg 2012年

44

任何带前缀的整数值0都是八进制值。即:01是八进制数1,010是八进制数10,即十进制数8,0是八进制数0(即十进制数,其他为0)。

所以是的,“ 0”是八进制。

那是@Als的答案中语法片段的简单英语翻译:-)


一个整数前缀0x没有前缀00x是一个明显不同的前缀。显然有些人无法做出这种区分。

按照相同的标准,如果我们继续:

 integer-literal:
     decimal-literal integer-suffixopt
     octal-literal integer-suffixopt
     hexadecimal-literal integer-suffixopt
 decimal-literal:
     nonzero-digit                       <<<---- That's the case of no prefix.
     decimal-literal digit-separatoropt digit
 octal-literal:
     0                                    <<<---- '0' prefix defined here.
     octal-literal digit-separatoropt octal-digit <<<---- No 'x' or 'X' is
                                                          allowed here.
 hexadecimal-literal:
     0x hexadecimal-digit                 <<<---- '0x' prefix defined here
     0X hexadecimal-digit                 <<<---- And here.
     hexadecimal-literal digit-separatoropt hexadecimal-digit

5
“任何以'0'开头的整数值都是八进制值。” 不对。示例:0xA以“ 0”开头,是一个整数值。
Nikolai Ruhe

4
0x不是令牌。以开头的整数文字0x是单个标记。
基思·汤普森

4
您引用该定义的来源是什么?C(N1570 6.4)和C ++(C ++ 11 2.7 [lex.token])标准在语法上定义了“令牌”一词。0x不符合条件。(至少在C语言中,如果它不是十六进制常数的一部分,那么它是一个预处理数字(N1570 6.4.8),但这不是令牌。)
Keith Thompson

11
我们正在讨论C和C ++标准定义的整数常量/文字的语法。在这种情况下,标准的“令牌”定义如何最不适合使用?你侮辱性的屈尊是不适当的。而且,如果您认为我是个恶霸,指出了我认为答案中存在的技术错误,则建议您重新考虑该词的含义。(您从未回答过我有关定义来源的问题。)
Keith Thompson

4
如果有人好奇,那么“ 令牌是一个或多个字符的字符串,对于整个组来说是重要的。 ” 的说法似乎来自于Wikipedia的文章
Keith Thompson

-2

显然所有以零开头的整数文字实际上都是八进制的。这意味着它也包括0。由于零为零,因此差异不大。但是不知道这个事实会伤害您。

当我尝试编写将二进制数字转换为十进制和十六进制输出的程序时,我意识到了这一点。每当我给出从零开始的数字时,我都会得到错误的输出(例如012 = 10,而不是12)。

很高兴知道这些信息,这样您就不会犯同样的错误。


7
整数文字从零开始,但零后没有'x'。
luiscubal 2011年

5
没有证据的断言“是”也不是答案。
Lightness Races in Orbit

1
按照这个逻辑,09是一个八进制数。
2013年

3
@ 0xc0de:不,09不是八进制数字,因为它根本不是数字;它与任何类型的整数文字的语法都不匹配。
基思·汤普森

7
我非常有信心@ 0xc0de 知道09不是八进制数字。有人说:“ 按照这种逻辑09是一个八进制数。” 言下之意是,既然09不是一个八进制数,逻辑一定是错的。
TRiG 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.