В последнем экзамене у нас было упражнение, чтобы определить вывод следующего кода:
System.out.println(2 + 3 + ">=" + 1 + 1);
Мой ответ был 5 >= 2
, но теперь я понимаю, что это неправильный ответ. Это должно быть 5 >= 11
.
Но почему?
В последнем экзамене у нас было упражнение, чтобы определить вывод следующего кода:
System.out.println(2 + 3 + ">=" + 1 + 1);
Мой ответ был 5 >= 2
, но теперь я понимаю, что это неправильный ответ. Это должно быть 5 >= 11
.
Но почему?
Предполагая, что ваш синтаксис:
System.out.println(2 + 3 + ">=" + 1 + 1);
выражения оцениваются слева направо, в этом случае 2 + 3 получают суммирование до 5 и когда "добавлено" к строке приводит к "5 >="
, который при добавлении к 1 дает "5 >= 1"
, добавляет еще один и ваш результат: "5 >= 11"
Потому что "добавление" строки к чему-либо приводит к конкатенации. Вот как он оценивается на этапе компиляции:
((((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"
Number+number=number
number+string=string
string+number=string
etc.
Оценивается слева направо. Вы объединяете "1"
в "5 >="
и, наконец, "1"
в "5 >= 1"
.
Прочитайте его один токен за один раз слева направо:
Первый литерал, который встречается, представляет собой целое число, 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"
.