零总是零,所以没关系。但在最近与一位朋友的讨论中,他说八进制文字在今天几乎没有人使用。†然后我突然意识到,实际上在我的代码中几乎所有的整数文字都是八进制,即0。

根据c++语法,0是八进制字面值吗?标准是怎么说的?

†我所知道的唯一真正的用途是unix文件权限。


是的,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

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

是的,'0'是八进制。

这是@ al回答中语法片段的简单英语翻译:-)


带0x前缀的整数不带0前缀。0x是一个显式不同的前缀。显然,有些人无法区分这两者。

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

 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

显然,所有以0开头的整数实际上都是八进制。这意味着它也包括0。这没什么区别,因为0就是0。但不知道这个事实会伤害到你。

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

知道这些信息很好,这样你就不会犯同样的错误。