Zéro est toujours zéro, donc cela n'a pas d'importance. Mais lors d'une récente discussion avec un ami, il a déclaré que les littéraux octaux n'étaient presque pas utilisés aujourd'hui. † Ensuite, il m'est apparu qu'en fait, presque tous les littéraux entiers de mon code sont octaux, à savoir 0
.
Un 0
octal littéral est-il conforme à la grammaire C ++? Que dit la norme?
† La seule utilisation réelle que je connaisse concerne les autorisations de fichiers Unix.
Réponses:
Oui,
0
est un littéral octal en C ++.Selon la norme C ++:
2.14.2 Littéraux entiers [lex.icon]
la source
octal-literal
etdecimal-literal
sont des interprétations possibles du modèle d'octets, choisissezoctal-literal
. Le libellé de la norme officielle n'a pas ce problème.ERROR: 0 is ambiguous, could be octal zero or could be decimal zero. Consider using (1 - 1) to disambiguate
.1
toujours être octal et tout; P -ERROR: 0 is ambiguous, could be octal zero or could be decimal zero. Consider using (8 - 8) to disambiguate
Toute valeur entière précédée d'
0
un préfixe 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).Alors oui, «0» est un octal.
C'est une traduction anglaise simple de l'extrait de grammaire dans la réponse de @ Als :-)
Un entier préfixé par
0x
n'est pas préfixé par0
.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:
la source
0x
n'est pas un jeton. Un littéral entier commençant par0x
est un seul jeton.0x
n'est pas admissible. (Au moins en C, c'est un nombre de prétraitement (N1570 6.4.8) s'il ne fait pas partie d'une constante hexadécimale, mais ce n'est pas un jeton.)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 l'ai réalisé lorsque j'essayais d'écrire un programme pour convertir des nombres binaires en sortie décimale et hexidécimale. Chaque fois que je donnais un nombre commençant par zéro, j'obtenais la mauvaise sortie (par exemple, 012 = 10, pas 12).
Il est bon de connaître ces informations afin de ne pas commettre la même erreur.
la source
09
n'est pas un nombre octal, car ce n'est pas du tout un nombre; il ne correspond à la syntaxe d'aucun type de littéral entier.09
n'est pas un nombre octal. Ce qui a été dit était: " Selon cette logique ,09
c'est un nombre octal." L'implication est que, puisqu'il09
n'est pas un nombre octal, la logique doit être erronée.