2012-06-14 2 views
4

Можно создать дубликат:
Difference between int and int received by ParseInt in javaSystem.out.println ("abc" + 3 + 2); почему вывод - abc32, а не abc5?

System.out.println ("ABC" + 3 + 2); // Выход: abc32

System.out.println (3 + 2 + "abc"); // Выход: 5abc

В чем причина?

+2

Dup: http://stackoverflow.com/questions/11008538/difference-between-int-and-int-received-by-parseint-in-java/11008551#11008551 –

+0

Этот вопрос беспрецедентен!

+0

Он добавляет слева направо. Первый случай («abc» +3) +2, второй - (3 + 2) + «abc» –

ответ

16
"abc"+3 

преобразует 3 в строку

"abc3" 

Тогда

"abc3" + 2 

преобразует 2 в строку, а

"abc32" 

Чтобы получить числовой результат сделать

"abc" + (3 + 2) 
4

Потому что оператор «+», который вы написали, означает «string concatenate», а не «add», потому что он найден с левым контекстом, являющимся строковым значением. В этом случае вы получаете бесплатное принуждение к правильному значению через неявный ToString.

Вы, вероятно, получить то, что вы хотели, написав

System.out.println("abc"+(3+2)) 

«3» будет найден, не левый контекст, так что это просто целое число; следующий «+» находится с целым левым контекстом, поэтому он интерпретируется как действительный оператор добавления, поэтому (3 + 2) дает 5. Этот результат найден с левым контекстом «+», поэтому он принуждается к строке и конкатенированы для производства «abc5».

0

В первом случае 3 и 2 обрабатываются как строки, а затем конкатенируются отдельно до abc.

Во втором случае рассчитывается сумма 3+2, а затем она объединена с abc.

1

Выражения оцениваются слева направо (после применения порядка приоритета оператора). Если один из аргументов в пользу оператора + является строка, то результат является каскадной строкой разборе Int в строку

В первом случае:

"abc" + 3 -> "abc3" // String + int -> concatenate 
"abc3" + 2 -> "abc32" // String + int -> concatenate 

Во втором случае:

3 + 2 -> 5 // int + int -> add 
5 + "abc" -> "5abc" // int + String -> concatenate 
+1

* Операнды * оцениваются слева направо. Выражения оцениваются в соответствии с приоритетом оператора. В этом случае это одно и то же, но это не всегда. – EJP

+0

@ EJP Право. Отредактировал мой ответ. – Evans

1

Оценка выражения, в котором операторы имеют одинаковый приоритет, слева направо.В этом случае, другой порядок в выражениях вызывает оператор + к виду:

  1. конкатенация строк (целое число неявно преобразуется toString())
  2. собой сумму между 2 Целые

    «ABC "+ 3 + 2 = ((" abc "+ 3) + 2) = (" abc3 "+ 2) =" abc32 "

    3 + 2 +" abc "= ((3 + 2) +" abc ") = (5 +" abc ") =" 5abc "

Смежные вопросы