¿Es 0 un octal o un decimal en C?
language-lawyer literals (6)
Luego preguntó por qué se considera como octal en C ++ y decimal en Java
En aras de la integridad, vale la pena mencionar las especificaciones de Java también. De Java Language Specification 3.10.1 :
DecimalNumeral: 0 NonZeroDigit Digitsopt NonZeroDigit Underscores Digits
Un número decimal es el único dígito ASCII 0, que representa el número entero cero, o consiste en un dígito ASCII de 1 a 9 seguido opcionalmente por uno o más dígitos ASCII de 0 a 9 intercalados con guiones bajos, que representan un entero positivo.
OctalNumeral: 0 OctalDigits 0 Underscores OctalDigits
Un número octal consiste en un dígito ASCII 0 seguido de uno o más de los dígitos ASCII 0 a 7 intercalados con guiones bajos, y puede representar un entero positivo, cero o negativo.
Como puede ver, un 0
desnudo se considera decimal . Mientras que cualquier secuencia (no vacía) de dígitos precedida por 0
se considera como octal .
Curiosamente, de esa gramática:
-
0
es decimal - pero
00
es octal
Esta pregunta ya tiene una respuesta aquí:
- ¿Es 0 un literal decimal o un octal literal? 3 respuestas
He leído esto Es octal en C ++ y decimal en Java. Pero no hay descripción sobre C?
¿Va a hacer alguna diferencia si 0 es octal o decimal? Esta es la pregunta formulada por mi entrevistador. Dije que no y le expliqué que siempre es 0 independientemente de si es decimal o octal.
Luego preguntó por qué se considera como octal en C ++ y decimal en Java. Dije que es el estándar. Por favor, hágamelo saber qué es en C? ¿Hará alguna diferencia? ¿Por qué son diferentes en diferentes estándares?
Creo que depende de la implementación del compilador. Tenemos que ver el código fuente para determinar si marca una constante "0" como octal o no. Puedo definir la razón no octal de esta manera: Octals tiene el prefijo "0". Pero no hay prefijo. Si la constante es 00, entonces ES OCtal - "octal Zero" :)
Del estándar C (6.4.4.1 constantes enteras)
octal-constant:
0
octal-constant octal-digit
De hecho, no hay ninguna diferencia para cero porque cero es un dígito común para los números octales, decimales y hexadecimales. Tiene significado solo cuando un número tiene otros dígitos aparte del cero (inicial) único.
Tenga en cuenta que no existen tipos integrales como decimal, octal o hexadecimal.
Es un octal. Consulte la sección 6.4.4.1 Integer constants
de enteros del borrador 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
También:
- Una constante decimal comienza con un dígito distinto de cero y consiste en una secuencia de dígitos decimales. Una constante octal consiste en el prefijo 0 seguido opcionalmente por una secuencia de los dígitos 0 a 7 solamente. Una constante hexadecimal consiste en el prefijo 0x o 0X seguido de una secuencia de los dígitos decimales y las letras a (o A) a f (o F) con los valores 10 a 15 respectivamente.
Hace poca diferencia, pero formalmente la constante entera 0
es octal en C. De los estándares C99 y C11, 6.4.4.1 Constantes de enteros
entero constante
decimal-constante entero-sufijo opt
octal-constant integer-sufijo opt
hexadecimal-constante entero-sufijo optconstante decimal
dígito distinto de cero
dígito de constante decimalconstante octal :
0
octal-constant octal-digitconstante hexadecimal :
...
...
Octal.
C11 §6.4.4.1 Constantes de enteros
octal-constant: 0 octal-constant octal-digit
Y esto es cierto ya que C89 §3.1.3.2 .