0是十进制字面值还是八进制字面值?

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

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

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

23273 次浏览

是的,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的整数是前缀为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

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

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

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