零总是零,所以没关系。但在最近与一位朋友的讨论中,他说八进制文字今天几乎没有使用。†</sup> 然后我突然意识到,实际上我的代码中几乎所有整数文字都是八进制的,即0
.
0
根据 C++ 语法是八进制文字吗?标准是怎么说的?
†</sup> 我知道的唯一真正用途是用于 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' 是一个八进制数。
这是@Als答案中语法片段的简单英文翻译:-)
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。这几乎没有什么区别,因为零就是零。但不知道这个事实会伤害你。
当我尝试编写一个将二进制数转换为十进制和十六进制输出的程序时,我意识到了这一点。每次我给出一个以零开头的数字时,我都会得到错误的输出(例如,012 = 10,而不是 12)。
很高兴知道这些信息,这样您就不会犯同样的错误。