Преобразование типов int и string, java - PullRequest
12 голосов
/ 08 декабря 2010

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

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

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

Ответы [ 5 ]

18 голосов
/ 08 декабря 2010

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

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

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

11 голосов
/ 08 декабря 2010

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

((((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 голосов
/ 08 декабря 2010
Number+number=number
number+string=string
string+number=string
etc.
1 голос
/ 08 декабря 2010

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

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

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

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

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

1 голос
/ 08 декабря 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...