Целочисленная арифметика в Java с char и целым литералом
Может кто-нибудь объяснить мне, почему следующий код компилируется на Java?
char c = 'a' + 10;
Почему это не эквивалентно следующему, который не компилируется?
int i = 10;
char c = 'a' + i;
Спецификация языка Java (раздел 3.10.1) гласит: "Integer литерал имеет тип long
, если он суффикс с буквой ASCII L или l (ell), в противном случае это тип int
(§4.2 0,1)". Раздел 4.2.2 относится к "Численным операторам, которые приводят к значению типа int
или long
". Таким образом, результат добавления должен, по моему мнению, быть int
, который не может быть назначен переменной char
c
.
Однако он компилируется отлично (по крайней мере, в выпуске Sun JDK 1.6.0 17 и в Eclipse Helios).
Скорее искусственный пример, возможно, но он используется во вводном курсе Java, который я преподавал, и теперь мне приходит в голову, что я действительно не понимаю, почему он работает.
Ответы
Ответ 1
'a' + 10
- выражение константы времени компиляции со значением 'k'
, которое может инициализировать переменную типа char
. Это то же самое, что и возможность назначить переменную byte
с целым числом буква в [-128, 127]. A byte
в диапазоне [128, 255] может быть более раздражающим.
Ответ 2
Это потому, что компилятор может проверить, что он ('a' + 10
) находится в пределах char, тогда как он не может (в общем) проверить, что 'a' + <an integer>
находится в пределах.
Ответ 3
char представляет собой неподписанное 16-разрядное целое число с диапазоном 0-65535. Таким образом, вы можете назначить любой целочисленный литерал в этом диапазоне до char, например, char c = 96 ", что приводит к тому, что символ" c "удерживает символ" a ". Вы можете распечатать результат с помощью System.out.println(c).
Для константного выражения в правой части "char c = 'a' + 10", 'a' повышается до int сначала из-за правил рассылки числовых символов Java, а целочисленное значение равно 96. После добавления 10 к нему мы получаем буквальное целое число 106, которое может быть присвоено char.
Правая сторона "char c = 'a' + i" не является константным выражением, и для правила присваивания результата выражения требуется явное преобразование из int в char, то есть "char c = (char) ('a' + i)".
Ответ 4
Константа имеет другой тип (я знаю, что spec говорит, что 10
должен быть int, но компилятор не видит его таким образом).
В char c = 'a' + 10
10 фактически считается постоянной переменной типа char (поэтому ее можно добавить в a). Поэтому char c = char + char
работает.
В int i = 10;
char c = 'a' + i;
Вы добавляете char к целому числу (целое число может быть намного больше, чем char, поэтому он выбирает больший тип данных [int
] как результат aka: 'a' + i = int + int
). Таким образом, результатом добавления является целое число, которое не может вписаться в char c
.
Если вы явно набрали i
как char (например. char c = 'a' + (char)i;
), это может сработать, или если вы сделали обратное (например: int c = (int)'a' + i;
), это сработает.