c++ - 0x8 - what is the value of the following integer literal? 0x17
¿Por qué no se compila “0xe+1”? (1)
Mira este fragmento de código:
int a = 0xe+1;
Clang, gcc, icc no compilan esto:
t.cpp:1:12: error: invalid suffix ''+'' on integer constant
MSVC compila con éxito.
¿Qué compilador es correcto? Si clang y gcc son correctos, ¿por qué sucede esto?
Nota: si agrego un espacio antes de +
, el código se compila. Si cambio 0xe
a 0xf
, también se compila. ¿Quizás esto tiene que ver con la notación exponencial (como 1.2e+3
)?
0xe+1
se trata como un token de preprocesamiento de "número de preprocesamiento" único. Esta regla de tokenización no se alinea con la definición de literales numéricos en la gramática ordinaria; los números de preprocesamiento se definen como
pp-number:
digit
. digit
pp-number digit
pp-number identifier-nondigit
pp-number '' digit
pp-number '' nondigit
pp-number e sign
pp-number E sign
pp-number p sign
pp-number P sign
pp-number .
Si las reglas de tokenización se basaran en las definiciones literales numéricas en lugar de la definición más simple de "número de preprocesamiento", su expresión sería tokenizada como 0xe + 1
, pero como las reglas no coinciden, obtiene un solo 0xe+1
, que no es un literal válido.