почему символ + другой символ = странное число
-
19-09-2019 - |
Вопрос
Вот фрагмент кода:
public static void main (String[]arg)
{
char ca = 'a' ;
char cb = 'b' ;
System.out.println (ca + cb) ;
}
Результатом является:
195
Почему это так происходит?Я бы подумал, что 'a' + 'b'
было бы либо "ab"
, "12"
, или 3
.
Что здесь происходит?
Решение
+
из двух char
это арифметическое сложение, а не конкатенация строк.Вам нужно сделать что-то вроде "" + ca + cb
, или используйте String.valueOf
и Character.toString
методы, гарантирующие, что хотя бы один из операндов +
это String
чтобы оператор представлял собой конкатенацию строк.
JLS 15.18 Аддитивные операторы
Если тип любого операнда
+
операторString
, то операция представляет собой конкатенацию строк.В противном случае тип каждого из операндов
+
Оператор должен быть типом, который можно преобразовать в примитивный числовой тип, иначе произойдет ошибка времени компиляции.
Что касается того, почему вы получаете 195, то это потому, что в ASCII 'a' = 97
и 'b' = 98
, и 97 + 98 = 195
.
Это выполняет базовые int
и char
Кастинг.
char ch = 'a';
int i = (int) ch;
System.out.println(i); // prints "97"
ch = (char) 99;
System.out.println(ch); // prints "c"
При этом игнорируется проблема схем кодирования символов (о которой новичку беспокоиться не стоит...еще!).
В качестве примечания Джош Блох отметил, что весьма прискорбно, что +
перегружен как для конкатенации строк, так и для сложения целых чисел («Возможно, было ошибкой перегружать оператор + для конкатенации строк». -- Java-головоломки, Головоломка 11:Последний смех).Многих подобных путаниц можно было бы легко избежать, если бы для конкатенации строк использовался другой токен.
Смотрите также
Другие советы
Я не говорю на Java, но 195 — это 97 + 98 = коды ASCII для a
и b
.Итак, очевидно, ca
и cb
интерпретируются как их целочисленные значения, вероятно, из-за +
дополнение, которое, похоже, не приводит к автоматической конкатенации строк.
Если вы хотите получить строку в результате оператора +, вам необходимо использовать тип String в качестве операндов.
Вам следует написать:
public static void main (String[]arg)
{
String ca = "a" ;
String cb = "b" ;
System.out.println (ca + cb) ;
}
Оператор +, применяемый к символьным операндам, ведет себя как арифметическая сумма.
Тот Самый +
operator не оперирует символами так, как он оперирует строками.То, что здесь происходит, заключается в том, что a
и b
преобразуются в их целочисленные кодовые точки ASCII - 97 и 98 - и затем суммируются.