341

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

0根据 C++ 语法是八进制文字吗?标准是怎么说的?

†</sup> 我知道的唯一真正用途是用于 unix 文件权限。

4

3 回答 3

302

是的,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
于 2011-08-01T07:48:30.910 回答
45

任何带有前缀的整数值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
于 2011-08-01T07:54:34.437 回答
-2

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

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

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

于 2011-08-01T13:06:32.507 回答