c language-lawyer literals octal

¿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í:

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:

  1. 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 opt

constante decimal
dígito distinto de cero
dígito de constante decimal

constante octal :
0
octal-constant octal-digit

constante 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 .