System.out.println(1 + 2 + "3");
Вывод: 33
System.out.println("1" + 2 + 3);
Вывод: 123
System.out.println(1 + 2 + "3");
Вывод: 33
System.out.println("1" + 2 + 3);
Вывод: 123
Ну, это вещь, называемая порядком операций.
1 + 2 вычисляется равным 3, а затем добавляется строка "3", которая преобразует первые 3 в строку и печатает "33".
В вашем втором экземпляре "1" уже является строкой, поэтому добавление чисел преобразует их в строки для соответствия, поэтому добавление "2", а затем добавление "3" и печать "123".
P.S. Строки имеют приоритет, потому что они имеют более высокий приоритет каста, чем целые, поэтому он преобразует целые числа в строки, но не строки в целые числа, как со вторым примером.
Первый оператор добавляет 1 и 2 (так как оба являются целыми), а затем преобразует их в строку и добавляет строку "3".
Второй оператор имеет строку "1" и преобразует все следующие аргументы в строки. Итак, вы получаете 123.
В случае 1 + 2 + "3"
Сложение 1 и 2 выполняется первым, следующим 3 соединено с 3.
В "1" + 2 + 3
1 объединяется в 2, и результат ( "12" ) объединяется с 3
Следует помнить следующее:
Если любой из операндов в + является строкой +, действует как конкатенация else, она работает как дополнение.
В случае первого, он делает 1 + 2, тогда он выполняет операцию конкатенации строк, чтобы он дал вам 33.
В случае второго оператора он выполняет конкатенацию строк для всех операндов, поскольку первая
Оператор- строка. Чтобы он дал вам 123
Я не эксперт по Java, но, полагаю, выражения читаются слева направо здесь.
В первом случае сначала вычисляется 1 + 3, что дает 3 затем 3 + "3", которые преобразуют первые 3 в строку и дают "33"
Во втором случае он начинается с "1" + 2, который дает "12", а затем "12" + 3 = "123"
Это побочный эффект наличия оператора +, который объединяет 2 строки и другую, которая добавляет 2 числа.
Это определяется Спецификация Java Language # 15.18.1
Оператор + синтаксически лево-ассоциативный, независимо от того, определяется ли он анализом типов для представления конкатенации строк или числового добавления. В некоторых случаях для получения желаемого результата требуется уход. Например, выражение:
a + b + c
всегда рассматривается как значение:(a + b) + c
Тогда для каждой подгруппы (a+b)
(назовем ее x
) и (x + c)
:
Если только одно выражение операнда имеет тип String, то преобразование строки (§ 5.1.1.11) выполняется в другом операнде для создания строки во время выполнения.
Компилятор преобразует операнд в его эквивалент строки каждый раз, когда другой операнд + - это экземпляр Строка.
Для второго случая: Приоритет оператора приводит к тому, что сначала выполняется конкатенация "1" со строковым эквивалентом 2. Этот результат затем объединяется со строковым эквивалентом 3 раза.
Чтобы завершить целочисленное добавление сначала, вы должны использовать круглые скобки, например:
System.out.println("1" + (2 + 3));
В первом случае: Приоритет оператора сначала добавит 1 и 2. Теперь строковый эквивалент этого результата затем объединяется с "3".
System.out.println(-1 → > 1);
Во втором случае: приоритет оператора приводит к тому, что первое совпадение имеет значение "1" с эквивалентом строки 2. Этот результат затем объединяется со строковым эквивалентом 3 раза.
Чтобы завершить целочисленное добавление сначала, вы должны использовать круглые скобки, например: