В последнем экзамене у нас было упражнение, чтобы определить вывод следующего кода:
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".