Целочисленная арифметика в 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;), это сработает.