J'ai lu ceci . Il est octal en C++ et décimal en Java. Mais aucune description de C?
Cela fera-t-il une différence si 0 est octal ou décimal? Telle est la question posée par mon intervieweur. J'ai dit non et j'ai expliqué qu'il est toujours égal à 0, qu'il soit octal ou décimal.
Il a ensuite demandé pourquoi il est considéré comme octal en C++ et décimal en Java. J'ai dit que c'était la norme. Veuillez me faire savoir ce que c'est en C? Cela fera-t-il une différence? Pourquoi sont-ils différents selon les normes?
Cela fait peu de différence, mais officiellement la constante entière 0
est octal en C. D'après les normes C99 et C11, 6.4.4.1 Constantes entières
constante entière :
constante décimale suffixe entieropt
constante octale suffixe entieropt
constante hexadécimale suffixe entieroptconstante décimale :
chiffre non nul
constante décimale chiffreconstante octale :
0
constante octale chiffre octalconstante hexadécimale :
...
...
Octal.
C11 §6.4.4.1 Constantes entières
octal-constant: 0 octal-constant octal-digit
Et cela est vrai puisque C89 §3.1.3.2 .
Puis il a demandé pourquoi est-il considéré comme octal en C++ et décimal en Java
Par souci d'exhaustivité, il convient de mentionner Java spécifications également. De Java Language Specification 3.10.1 :
DecimalNumeral: 0 NonZeroDigit Digitsopt NonZeroDigit Underscores Digits
Un chiffre décimal est soit le seul ASCII chiffre 0, représentant le zéro entier, soit un ASCII chiffre de 1 à 9 éventuellement suivi d'un ou de plusieurs ASCII chiffres de 0 à 9 entrecoupés de traits de soulignement, représentant un entier positif.
OctalNumeral: 0 OctalDigits 0 Underscores OctalDigits
Un chiffre octal se compose d'un ASCII chiffre 0 suivi d'un ou plusieurs des ASCII chiffres 0 à 7 entrecoupés de traits de soulignement) et peut représenter un zéro positif , ou entier négatif.
Comme vous pouvez le voir, un 0
est considéré comme décimal . Alors que toute séquence (non vide) de chiffres précédée de 0
est considéré comme octal .
Chose intéressante, d'après cette grammaire:
0
est décimal00
est octalC'est un octal. Voir section 6.4.4.1 Integer constants
du projet 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 différent de zéro et se compose d'une séquence de chiffres décimaux. Une constante octale se compose du préfixe 0 suivi facultativement d'une séquence des chiffres 0 à 7 uniquement. Une constante hexadécimale se compose du préfixe 0x ou 0X suivi d'une séquence de chiffres décimaux 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 car zéro est un chiffre commun pour les nombres octaux, décimaux et hexadécimaux. Il n'a de sens que lorsqu'un nombre a d'autres chiffres que le zéro (principal).
Tenez compte du fait qu'il n'existe aucun type intégral tel que décimal, octal ou hexadécimal.