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 0
un 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í,
0
es un literal octal en C ++.Según el estándar C ++:
2.14.2 Literales enteros [lex.icon]
fuente
octal-literal
ydecimal-literal
son 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
.1
aún siendo octal y todo; P -ERROR: 0 is ambiguous, could be octal zero or could be decimal zero. Consider using (8 - 8) to disambiguate
Cualquier valor entero con el 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 simple traducción al inglés del fragmento de gramática en la respuesta de @ Als :-)
Un entero prefijo
0x
está no con el prefijo0
.0x
es un prefijo explícitamente diferente. Aparentemente hay personas que no pueden hacer esta distinción.Según ese mismo estándar, si continuamos:
fuente
0x
No es una ficha. Un literal entero que comienza con0x
es un token único.0x
no 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
09
no 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.09
no es un número octal. Lo que se dijo fue: " Según esta lógica ,09
es un número octal". La implicación es que, dado09
que no es un número octal, la lógica debe estar equivocada.