El cero siempre es cero, por lo que no importa. Pero en una discusión reciente con un 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, a saber 0.
¿Es 0un literal octal de acuerdo con la gramática de C ++? ¿Qué dice el estándar?
† El único uso real que conozco es para los permisos de archivos Unix.

Respuestas:
Sí,
0es un literal octal en C ++.Según el estándar C ++:
2.14.2 Literales enteros [lex.icon]
fuente
octal-literalydecimal-literalson posibles interpretaciones del patrón de bytes, recogeroctal-literal. La redacción del estándar oficial no tiene este problema.ERROR: 0 is ambiguous, could be octal zero or could be decimal zero. Consider using (1 - 1) to disambiguate.1aún siendo octal y todo; P -ERROR: 0 is ambiguous, could be octal zero or could be decimal zero. Consider using (8 - 8) to disambiguateCualquier valor entero con el prefijo
0es 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 simple traducción al inglés del fragmento de gramática en la respuesta de @ Als :-)
Un entero prefijo
0xestá no con el prefijo0.0xes un prefijo explícitamente diferente. Aparentemente hay personas que no pueden hacer esta distinción.Según ese mismo estándar, si continuamos:
fuente
0xNo es una ficha. Un literal entero que comienza con0xes un token único.0xno califica (Al menos en C, es un número de preprocesamiento (N1570 6.4.8) si no es parte de una constante hexadecimal, pero eso no es un token.)Aparentemente, todos los literales enteros que comienzan con cero son de hecho octales. Esto significa que incluye 0 también. Esto hace poca diferencia ya que cero es cero. Pero no saber este hecho puede lastimarte.
Me di cuenta de esto cuando intentaba escribir un programa para convertir números binarios en salida decimal y hexadecimal. Cada vez que daba un número que comenzaba con cero, obtenía un resultado incorrecto (por ejemplo, 012 = 10, no 12).
Es bueno saber esta información para no cometer el mismo error.
fuente
09no es un número octal, porque no es un número en absoluto; no coincide con la sintaxis para ningún tipo de literal entero.09no es un número octal. Lo que se dijo fue: " Según esta lógica ,09es un número octal". La implicación es que, dado09que no es un número octal, la lógica debe estar equivocada.