добавить два типа данных char в Java - PullRequest
0 голосов
/ 12 июня 2018

case 1:

char c='A'+'A'; 
System.out.println(c);   // print question mark (?)

case 2:

char c1='A';
char c2='A'+c1;   // Compile time error
System.out.println(c2);   

В case1 у меня есть логика Когда я добавляю два литерала char, сумма значения ascii выводится на печать, что эквивалентночтобы оценить значение знака вопроса.Но в случае 2, почему ошибка времени компиляции показывает, что ' не может преобразовать из int в char '

, если char + char = int, тогда это правило должно применяться в обоих случаях.

Ответы [ 4 ]

0 голосов
/ 12 июня 2018

В первом случае добавляются два final символа, и во время компиляции проверяется, что результирующее int не переполняет символ.

Во втором случае один операнд не является окончательными компилятор отказывается делать сумму.Немного глуп, но, учитывая многопоточность и другие случаи, может быть оправдано.По крайней мере, легко понимаемое правило.

Выполнение

final char c1 = '0';
char c2 = '1' + c1; // 'a'

должно компилироваться.

(Само собой разумеется, что никогда не следует делать что-то вроде '0'+'1'.)

0 голосов
/ 12 июня 2018

Во втором случае возникает ошибка, так как JLS 5.6.2 оба операнда двоичного выражения преобразуются в int.

Чтобы это работало, необходимо добавить явное приведение:

char c2=(char)('A'+c1);
0 голосов
/ 12 июня 2018

Результатом добавления Java-символов, шортов или байтов является int

См. Подробные ответы на этот пост: В Java это результат добавления двух символов: int или a.обугливается

0 голосов
/ 12 июня 2018

Добавление или 2 или более переменных, которые имеют тип int или ниже, чем int, приводят к типу int.

Так что то, что вы делаете с char c2 = 'A' + c1;, фактически не дает вам результата char.Это дает вам int результат, который вы пытаетесь неявно набрать приведение к байту, что дает вам ошибку времени компиляции.

Сводка Char + Char = Int И Char не может напрямую хранить Int.

Попробуйте сделать это вместо этого char c2 = (char)('A' + c1);

Здесь вы явно вводите приведение значения int к типу char. Сообщая компилятору, что вы готовы принять преобразование с потерями что может случиться

...