¿Es 0 un literal decimal o un octal literal?

Zero siempre es cero, por lo que no importa. Pero en una discusión reciente con mi amigo dijo que los literales octales casi no se usan hoy. Entonces me di cuenta de que en realidad casi todos los literales enteros en mi código son octales, es decir, 0 .

¿Es 0 un octal literal según la gramática de C ++? ¿Qué dice el estándar?

Sí, 0 es un literal octal en C ++.

Según el estándar de C ++:

2.14.2 literales enteros [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 <-------------------- octal-literal octal-digit 

Cualquier valor entero con prefijo 0 es un valor octal. Es decir: 01 es octal 1, 010 es octal 10, que es decimal 8, y 0 es octal 0 (que es decimal, y cualquier otro, 0).

Entonces sí, ‘0’ es un octal.

Esa es una traducción sencilla en inglés del fragmento de gramática en la respuesta de @ Als 🙂


Un entero con prefijo 0x no tiene el prefijo 0 . 0x es un prefijo explícitamente diferente. Aparentemente hay personas que no pueden hacer esta distinción.

Según el mismo estándar, si continuamos:

  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 

Aparentemente, todos los literales enteros que comienzan con cero son de hecho octal. Esto significa que incluye 0 también. Esto hace poca diferencia ya que cero es cero. Pero no saber esto puede hacerte daño.

Me di cuenta de esto cuando estaba tratando de escribir un progtwig para convertir números binarios a salida decimal y hexadecimal. Cada vez que daba un número que comenzaba con cero obtenía el resultado incorrecto (por ejemplo, 012 = 10, no 12).

Es bueno saber esta información para que no cometas el mismo error.