2010-12-08 1 views
11

последний экзамен у нас было упражнение, чтобы определить выход следующего кода:Преобразование типа ИНТ и строки Java

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

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

+0

Это недопустимый код Java. Исправьте ошибку синтаксиса. – cdhowie 2010-12-08 18:56:28

+0

извините, обновлено :) – 2010-12-08 18:57:19

+2

Я не уверен, но я думаю, что это может быть связано с тем фактом, что вы перешли на строку частично через печать. 2 + 3 будет рассматриваться как целое число, но как только вы нажмете на «> =», я думаю, что он переключается на рассмотрение остальной части строки в виде строки.поэтому, если вы берете строку «> =» плюс строку «1» и «1», то вы получаете> = 11. Опять же, я не уверен в этом, но, похоже, имеет смысл. – guildsbounty 2010-12-08 19:00:10

ответ

17

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

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

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

1

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

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" 
1

Давайте прочитаем это один маркер в то время, слева направо:

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

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

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

И наконец, у нас есть "5>=1", a String, a + и a 1. его снова объединяет String. Результат: "5>=11".

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