web-dev-qa-db-fra.com

0 est-il un littéral décimal ou un littéral octal?

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?

323
ybungalobill

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
289
Alok Save

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
44
littleadv