Zéro est toujours zéro, donc peu importe. Mais dans une discussion récente avec mon ami, il a dit que les littéraux octaux sont presque inutilisés aujourd’hui. Puis, il m’est apparu que presque tous les littéraux entiers de mon code étaient en octal, à savoir 0
.
Est-ce que 0
est un littéral octal selon la grammaire C ++? Que dit la norme?
Oui, 0
est un littéral octal en C ++.
Selon le standard C ++:
2.14.2 Entiers littéraux [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 <-------------------- octal-literal octal-digit
Toute valeur entière préfixée par 0
est une valeur octale. Ie: 01 est octal 1, 010 est octal 10, qui est décimal 8, et 0 est octal 0 (qui est décimal, et tout autre, 0).
Donc oui, ‘0’ est un octal.
C’est clair la traduction anglaise de l’extrait de grammaire dans la réponse de @ Als 🙂
Un entier préfixé avec 0x
n’est pas préfixé avec 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
Apparemment, tous les littéraux entiers commençant par zéro sont en fait octaux. Cela signifie qu’il inclut également 0. Cela fait peu de différence puisque zéro est zéro. Mais ne pas savoir ce fait peut vous blesser.
Je m’en suis rendu compte lorsque j’essayais d’écrire un programme pour convertir des nombres binarys en décimales et en hexadécimaux. Chaque fois que je donnais un nombre commençant par zéro, je n’obtenais pas le bon résultat (par exemple, 012 = 10, pas 12).
Il est bon de connaître ces informations pour ne pas commettre la même erreur.