+ = оператор со строкой и приведенным символом - PullRequest
0 голосов
/ 14 января 2019

Это может быть глупый вопрос, но я нашел взаимодействие, которое не могу понять. Я думаю, что это связано с тем, как работает + =.

String temp = "";
temp += (char) 90 + 10;
System.out.println(temp); // "100"
temp = "" + (char) 90 + 10;
System.out.println(temp); // "Z10"

Z10 имеет смысл. 100 нет. Я бы подумал, что вторая строка будет выполняться одним из двух разных способов, чтобы получить «Z10» или «d». Почему кастинг, похоже, игнорируется?

Ответы [ 3 ]

0 голосов
/ 14 января 2019

Операторы присваивания, такие как +=, имеют самый низкий приоритет , и поэтому += оценивается после +.

Следовательно, перед вычислением оператора += оцениваются его 2 операнда. Первый операнд temp, а второй операнд (char) 90 + 10. (char) 90 + 10 оценивается как 100 (два числовых операнда, поэтому + выполняет сложение). Следовательно, 100 объединяется с пустым String, на который ссылается temp, что приводит к String "100".

С другой стороны, в

temp = "" + (char) 90 + 10;

есть два + оператора. Оба имеют одинаковый приоритет, поэтому они оцениваются слева направо.

  • Сначала "" + (char) 90 выполняет объединение String и char, в результате чего String, чей единственный символ является символом, соответствующим значению 90 ("Z").

  • Затем второй + объединяет int 10 с String "Z", в результате чего String "Z10".

0 голосов
/ 14 января 2019

Приведение типов имеет более высокий приоритет, чем арифметические операторы.

(char) 90 + 10 оценивается как ((char) 90) + (10). Результатом добавления char к int будет int.

Вместо этого вы хотите (char) (90 + 10), то есть привести результат сложения к char. Затем он будет добавлен к String как char:

    String temp = "";
    temp += (char) (90 + 10);
    System.out.println(temp); // prints "d"
0 голосов
/ 14 января 2019

Это не имеет ничего общего с +=. Это связано с тем, как работает +.

Если любой из операндов + имеет тип String, + является оператором конкатенации строк; в противном случае это числовое дополнение.


temp += (char) 90 + 10; 

совпадает с

temp += ((char) 90 + 10);

Таким образом, сначала вычисляется скобка, а затем применяется +=. Здесь ни (char) 90, ни 10 не являются String с, поэтому + является числовым сложением.

Чтобы сделать числовое сложение, оба операнда должны быть совместимы - это называется двоичное числовое продвижение . Если операндами являются char и int, char расширяется до int.

Следовательно, (char) 90 немедленно расширяется до 90; затем можно добавить два int - получая 100 - и затем добавить к строке temp через +=.


С другой стороны

temp += "" + (char) 90 + 10;

совпадает с

temp += (("" + (char) 90) + 10);

Итак, сначала оцениваются самые внутренние скобки.

Поскольку "" - это String, "" + (char) 90 - это конкатенация строк, в результате чего получается значение "Z". Это тоже String; поэтому "Z" + 10 также является конкатенацией строк, в результате чего "Z10".

...