Is 0 a decimal literal or an octal literal?
Zero is always zero, so it doesn't matter. But in a recent discussion with a friend he said that octal literals are almost unused today.† Then it dawned upon me that actually almost all integer literals in my code are octal, namel开发者_开发技巧y 0
.
Is 0
an octal literal according to the C++ grammar? What does the standard say?
† The only real use I'm aware of is for unix file permissions.
Yes, 0
is an Octal literal in C++.
As per the C++ Standard:
2.14.2 Integer literals [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
Any integer value prefixed with 0
is an octal value. I.e.: 01 is octal 1, 010 is octal 10, which is decimal 8, and 0 is octal 0 (which is decimal, and any other, 0).
So yes, '0' is an octal.
That's plain English translation of the grammar snippet in @Als's answer :-)
An integer prefixed with 0x
is not prefixed with 0
. 0x
is an explicitly different prefix. Apparently there are people who cannot make this distinction.
As per that same standard, if we continue:
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
Apparently all integer literals starting with zero are in fact octal. This means that it includes 0 as well. This makes little difference since zero is zero. But not knowing this fact can hurt you.
I realized this when I was trying to write a program to convert binary numbers to decimal and hexidecimal output. Everytime that I was giving a number starting with zero I was getting the wrong output (For example, 012 = 10, not 12).
It's good to know this information so you don't make the same mistake.
精彩评论