零总是零,所以没关系。但在最近与一位朋友的讨论中,他说八进制文字在今天几乎没有人使用。†然后我突然意识到,实际上在我的代码中几乎所有的整数文字都是八进制,即0。
根据c++语法,0是八进制字面值吗?标准是怎么说的?
†我所知道的唯一真正的用途是unix文件权限。
零总是零,所以没关系。但在最近与一位朋友的讨论中,他说八进制文字在今天几乎没有人使用。†然后我突然意识到,实际上在我的代码中几乎所有的整数文字都是八进制,即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)。
知道这些信息很好,这样你就不会犯同样的错误。