0 est-il octal ou décimal en C? [dupliquer]
cette question a déjà une réponse ici:
- Est 0 décimal littéral ou octal littérale? 3 réponses
j'ai lu ce . C'est octal en C++ et décimal en Java. Mais pas de description de C?
va-t-il faire différence si 0 est octal ou décimal? C'est la question posée par mon interlocuteur. J'ai dit non et j'ai expliqué qu'il est toujours 0, qu'il soit octal ou décimal.
alors il a demandé pourquoi est-il considéré comme octal en C++ et décimal en Java. Je l'ai dit c'est la norme. S'il vous plaît, dites-moi ce qu'il y a en C? Vont-il faire une différence? Pourquoi sont-elles différentes selon les normes?
6 réponses
il fait peu de différence, mais formellement la constante entière 0
est octal en C. des normes C99 et C11, 6.4.4.1 constantes entières
constante entière :
décimal-constant entier-suffixe opt
octal-constant entier-suffixe opt
hexadécimal-constante entier-suffixe optdécimal-constant :
non nul 1519100920 " décimal-constant chiffreconstante octale :
0
octal-constant octal chiffreshexadécimal-constante :
...
...
Octal.
C11 §6.4.4.1 constantes entières
octal-constant: 0 octal-constant octal-digit
et cela depuis C89 §3.1.3.2 .
alors il a demandé pourquoi est-il considéré comme octal en C++ et décimal en Java
par souci d'exhaustivité, il vaut la peine de mentionner les spécifications Java. De Java Language Specification 3.10.1 :
DecimalNumeral: 0 NonZeroDigit Digitsopt NonZeroDigit Underscores Digits
un chiffre décimal est soit le chiffre ASCII simple 0, représentant le zéro entier, ou se compose d'un chiffre ASCII de 1 à 9 éventuellement suivi d'un ou plusieurs chiffres ASCII de 0 à 9 intercalés de underscores, représentant un nombre entier positif.
OctalNumeral: 0 OctalDigits 0 Underscores OctalDigits
un chiffre octal se compose d'un chiffre ASCII 0 suivi d'un ou plusieurs des chiffres ASCII 0 à 7 entrecoupés de underscores, et peut représenter un nombre entier positif, zéro ou négatif.
comme vous pouvez le voir, un nu 0
est considéré comme décimal .
Attendu que toute séquence (non vide) de chiffres précédée de 0
est considérée comme octal .
assez intéressant, de cette grammaire:
-
0
est décimal - mais
00
est octal
c'est un octal. Voir la section 6.4.4.1 Integer constants
du projet de N1570:
integer-constant:
decimal-constant integer-suffixopt
octal-constant integer-suffixopt
hexadecimal-constant integer-suffixopt
decimal-constant:
nonzero-digit
decimal-constant digit
octal-constant:
0
octal-constant octal-digit
hexadecimal-constant:
hexadecimal-prefix hexadecimal-digit
hexadecimal-constant hexadecimal-digit
hexadecimal-prefix: one of
0x 0X
nonzero-digit: one of
1 2 3 4 5 6 7 8 9
octal-digit: one of
0 1 2 3 4 5 6 7
hexadecimal-digit: one of
0 1 2 3 4 5 6 7 8 9
a b c d e f
A B C D E F
integer-suffix:
unsigned-suffix long-suffixopt
unsigned-suffix long-long-suffix
long-suffix unsigned-suffixopt
long-long-suffix unsigned-suffixopt
unsigned-suffix: one of
u U
long-suffix: one of
l L
long-long-suffix: one of
ll LL
aussi:
- une constante décimale commence par un chiffre non nul et consiste en une séquence de chiffres décimaux. Une constante octale se compose du préfixe 0, éventuellement suivi d'une séquence des chiffres 0 à 7 seulement. Une constante hexadécimale se compose du préfixe 0x ou 0X suivi d'une séquence des décimales et des lettres a (ou A) à f (ou F) avec des valeurs de 10 à 15 respectivement.
de la norme C (6.4.4.1 constantes entières)
octal-constant:
0
octal-constant octal-digit
en fait, il n'y a aucune différence pour zéro parce que Zéro est un chiffre commun pour les nombres octal, décimal et hexadécimal. Il n'a de signification que lorsqu'un nombre a d'autres chiffres que le seul zéro (en tête).
tenir compte du fait qu'il n'existe pas de types intégraux tels que décimal, octal ou hexadécimal.
je pense que cela dépend de l'implémentation du compilateur. Nous devons voir le code source pour déterminer s'il affiche une constante "0" comme octal ou non. Je peux définir la raison non-octale de cette façon: Octals a le préfixe "0". Mais il n'y a pas de préfixe. Si la constante est 00, Alors c'est octal - "octal Zero":)