Преобразование типа int и string, java

В последнем экзамене у нас было упражнение, чтобы определить вывод следующего кода:

System.out.println(2 + 3 + ">=" + 1 + 1);

Мой ответ был 5 >= 2, но теперь я понимаю, что это неправильный ответ. Это должно быть 5 >= 11. Но почему?

Ответ 1

Предполагая, что ваш синтаксис:

System.out.println(2 + 3 + ">=" + 1 + 1);
выражения

оцениваются слева направо, в этом случае 2 + 3 получают суммирование до 5 и когда "добавлено" к строке приводит к "5 >=", который при добавлении к 1 дает "5 >= 1", добавляет еще один и ваш результат: "5 >= 11"

Ответ 2

Потому что "добавление" строки к чему-либо приводит к конкатенации. Вот как он оценивается на этапе компиляции:

((((2 + 3) + ">=") + 1) + 1)

Компилятор будет делать постоянную фальцовку, поэтому компилятор может фактически уменьшить выражение по одной части за раз и заменить в постоянном выражении. Однако, даже если он этого не сделает, путь выполнения будет таким же. Итак, вы идете:

((((2 + 3) + ">=") + 1) + 1) // original
(((5 + ">=") + 1) + 1)       // step 1: addition      (int + int)
(("5>=" + 1) + 1)            // step 2: concatenation (int + String)
("5>=1" + 1)                 // step 3: concatenation (String + int)
"5>=11"                      // step 4: concatenation (String + int)

Вы можете принудительно добавить целое число, разделив второе числовое выражение с помощью скобок. Например:

System.out.println(2 + 3 + ">=" + 1 + 1);   // "5>=11"
System.out.println(2 + 3 + ">=" + (1 + 1)); // "5>=2"

Ответ 3

Number+number=number
number+string=string
string+number=string
etc.

Ответ 4

Оценивается слева направо. Вы объединяете "1" в "5 >=" и, наконец, "1" в "5 >= 1".

Ответ 5

Прочитайте его один токен за один раз слева направо:

Первый литерал, который встречается, представляет собой целое число, 2, затем a +, затем другое целое число, 3. A + между двумя целыми числами является добавлением, поэтому они складываются вместе как 5.

Теперь мы имеем 5, целое число, то a +, а затем String ">=". A + между целым числом и строкой является оператором конкатенации. Итак, строки объединяются в форму "5>=".

Тогда имеем "5>=", String, a +, а затем целое число 1. Это снова конкатенация строк. Таким образом, результат "5>=1".

Наконец, мы имеем "5>=1", String, a + и a 1. его снова объединяет String. Таким образом, результат "5>=11".