почему символ + другой символ = странное число - PullRequest
2 голосов
/ 12 марта 2010

Вот фрагмент кода:

public static void main (String[]arg) 
{
    char ca = 'a' ; 
    char cb = 'b' ; 
    System.out.println (ca + cb) ; 
}

Вывод:

195

Почему это так? Я думаю, что 'a' + 'b' будет либо "ab", "12", либо 3.

Что здесь происходит?

Ответы [ 4 ]

14 голосов
/ 12 марта 2010

+ из двух 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 Puzzlers , Головоломка 11: Последний смех). Многих подобных путаниц можно легко избежать, если использовать другой токен для конкатенации строк.


Смотри также

3 голосов
/ 12 марта 2010

Если вы хотите иметь строку в качестве результата оператора +, вы должны использовать тип String в качестве операндов.

Вы должны написать:

public static void main (String[]arg) 
{
    String ca = "a" ; 
    String cb = "b" ; 
    System.out.println (ca + cb) ; 
}

Оператор +, применяемый к операндам типа char, ведет себя как арифметическая сумма.

3 голосов
/ 12 марта 2010

Я не говорю на Java, но 195 - это 97 + 98 = ASCII-коды для a и b. Очевидно, что ca и cb интерпретируются как их целочисленные значения, возможно, из-за добавления +, которое, по-видимому, не приводит к автоматической конкатенации строк.

1 голос
/ 12 марта 2010

Оператор + не работает с символами, как со строками. Здесь происходит то, что a и b приводятся к их целочисленным кодовым точкам ASCII - 97 и 98 - и затем складываются вместе.

...