Zéro est toujours zéro, alors peu importe. Mais lors d'une récente discussion avec mon ami, il a déclaré que les littéraux octaux sont presque inutilisés aujourd'hui. Ensuite, je me suis rendu compte qu'en fait presque tous littéraux entiers dans mon code are octal, à savoir 0
.
Est 0
un littéral octal selon la grammaire C++? Que dit la norme?
Oui, 0
est un littéral octal en C++.
Selon la norme C++:
2.14.2 Littéraux entiers [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
Toute valeur entière préfixée par 0
est une valeur octale. Ie .: 01 est l'octal 1, 010 est l'octal 10, qui est le nombre décimal 8, et 0 est le nombre octal 0 (qui est le nombre décimal, et tout autre, 0).
Alors oui, '0' est un octal.
C'est la traduction anglaise simple de l'extrait de grammaire dans la réponse de @ Als :-)
Un entier préfixé par 0x
est pas préfixé par 0
. 0x
est un préfixe explicitement différent. Apparemment, il y a des gens qui ne peuvent pas faire cette distinction.
Selon cette même norme, si nous continuons:
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