will - Aritmética de enteros en Java con char y literal entero
substring reverse java (4)
¿Alguien me puede explicar por qué el siguiente código compila OK en Java?
char c = ''a'' + 10;
¿Por qué esto no es equivalente a lo siguiente, que no se compila?
int i = 10;
char c = ''a'' + i;
La especificación del lenguaje Java (sección 3.10.1) dice que "Un literal entero es de tipo long
si tiene el sufijo de una letra ASCII L o l (ell); de lo contrario, es de tipo int
(§4.2.1)". La sección 4.2.2 se refiere a "Los operadores numéricos, que dan como resultado un valor de tipo int
o long
". Por lo tanto, el resultado de la adición debería ser, a mi entender, un int
, que no se puede asignar a la variable char
c
.
Sin embargo, se compila bien (al menos en Sun JDK 1.6.0 versión 17 y en Eclipse Helios).
Quizás sea un ejemplo artificial, pero se usa en un curso introductorio de Java que he estado enseñando, y ahora se me ocurre que realmente no entiendo por qué funciona.
Esto se debe a que el compilador puede verificar que ( ''a'' + 10
) está dentro de los límites de un char, mientras que no puede (en general) verificar que ''a'' + <an integer>
está dentro de los límites.
La constante es de un tipo diferente (sé que la especificación dice que 10
debería ser un int, pero el compilador no lo ve de esa manera).
En char c = ''a'' + 10
, 10 en realidad se considera una variable constante de tipo char (por lo que se puede agregar a a). Por lo tanto char c = char + char
funciona.
En int i = 10; char c = ''a'' + i;
int i = 10; char c = ''a'' + i;
Está agregando un char a un entero (un entero puede ser mucho más grande que un char, por lo que elige el tipo de datos más grande [ int
] para que sea el resultado: ''a'' + i = int + int
). Por lo tanto, el resultado de la adición es un entero, que no puede encajar en el char c
.
Si ha lanzado explícitamente i
para ser un char (por ejemplo: char c = ''a'' + (char)i;
) podría funcionar o si hizo lo contrario (por ejemplo: int c = (int)''a'' + i;
) funcionaria
char es en realidad un entero de 16 bits sin signo con un rango de 0-65535. Por lo tanto, puede asignar cualquier literal entero en ese rango a un char, por ejemplo, "char c = 96", lo que da como resultado que "c" contenga el carácter "a". Puede imprimir el resultado utilizando System.out.println (c).
Para la expresión constante en el lado derecho de "char c = ''a'' + 10", ''a'' se promueve a int primero debido a las reglas de promoción numérica de Java y el valor entero es 96. Después de agregarle 10 , obtenemos un entero literal 106, que puede asignarse a un char.
El lado derecho de "char c = ''a'' + i" no es una expresión constante y la regla de asignación de resultados de expresión requiere una conversión explícita de int a char, es decir, "char c = (char) (''a'' + i) ".
''a'' + 10
es una expresión constante en tiempo de compilación con el valor de ''k''
, que puede inicializar una variable de tipo char
. Esto es lo mismo que poder asignar una variable de byte
con un entero literal en [-128, 127]. Un byte
en el rango de [128, 255] puede ser más molesto.