Jshell неправильно печатает с помощью метода println

почему Jshell рассматривает r, s как строку при использовании без скобок?

PS C:\Users\saiko\OneDrive\Learning\java> Jshell                                                                                                                                             
|  Welcome to JShell -- Version 11.0.6
|  For an introduction type: /help intro

jshell> int p = 10;  int q =20; int r=5; int s=10;
p ==> 10
q ==> 20
r ==> 5
s ==> 10

jshell> if( (p+q) > (r+s) ) System.out.println( p+q+" is greater than  "+r+s );
30 is greater than  510

jshell> if( (p+q) > (r+s) ) System.out.println( (p+q) +" is greater than  "+ (r+s) );
30 is greater than  15

jshell>

person Gandikota Saikoushik    schedule 10.05.2020    source источник
comment
Потому что + левоассоциативный. Сначала вы добавляете строковый литерал к r, и он становится строкой, затем вы добавляете эту строку к s, так что r и s не складываются вместе, а просто соединяются   -  person user    schedule 11.05.2020
comment
Итак, вы имеете в виду, что после добавления 30 больше + 5 становится строкой 30 больше 5, а java считается 10 добавлением значения к строке 30 больше 5 и снова объединяется   -  person Gandikota Saikoushik    schedule 11.05.2020
comment
Да, это почти все   -  person user    schedule 11.05.2020
comment
Большое спасибо за ответ!   -  person Gandikota Saikoushik    schedule 11.05.2020


Ответы (1)


Как сказано в комментариях и в учебниках по Java:

Все бинарные операторы, кроме операторов присваивания, вычисляются слева направо.

В выражении p+q+" is greater than "+r+s первое вычисление p+q приводит к int, затем p+q+" is greater than " приводит к String, а все последующие вычисления также приводят к String.

Вот почему вы получаете:

30 is greater than  510
person Ortomala Lokni    schedule 09.12.2020