Вопрос:

Булева функциональность в Java

java string boolean println

172 просмотра

3 ответа

77 Репутация автора

String s1="hi";
String s2="hi";

boolean b1 = true;
boolean b2 = false;

(1) System.out.println(s1==s2);                            //true
(2) System.out.println(s1==s2 + s1==s2);                   //false
(3) System.out.println(s1==s2+ " " + s1==s2);              //false

(4) System.out.println(b1+b2);                             //error : bad operand types
(5) System.out.println(b1 + " " + b2);                     //true false
(6) System.out.println(true +" "+ s1==s2);                 //false
  • В чем разница между (2) и (4)?
  • В чем разница между (3) и (5)?
  • Почему это дает ложный результат в (3) и (6)?
Автор: CHAITHANYA PADALA Источник Размещён: 20.03.2014 07:26

Ответы (3)


12 плюса

95669 Репутация автора

Решение

За исключением 4, все они основаны на приоритетах операторов.

И в Java +имеет приоритет над ==.

Что означает 2 на самом деле «читает»:

s1 == ((s2 + s1) == s2)

Следовательно, правый операнд первого ==является логическим выражением, которое сравнивает две ссылки на объекты друг с другом (факт, что они оба Stringздесь не имеют значения), и здесь они не одинаковы. Следовательно, правый операнд является логическим false.

Но так как левая сторона операнд является String, и поскольку ==не применяется к операндам Stringи booleanэто дает ошибку компиляции. JLS, раздел 15.21 :

Операторы равенства могут использоваться для сравнения двух операндов, которые могут быть преобразованы (§5.1.8), с числовым типом, или двух операндов типа boolean или Boolean, или двух операндов, каждый из которых имеет ссылочный тип или нулевой тип. Все остальные случаи приводят к ошибке во время компиляции.

Если это действительно компилируется для вас, вы используете глючный компилятор Java, который автоматически помещает правый операнд в a Boolean, чего не должно быть. Позвольте мне угадать: Eclipse's ECJ?

4 - ошибка, поскольку +оператор не принимает booleans в качестве операндов.

3 читается почти так же, как 2, за исключением того, что на этот раз это s2 + " " + s1(с попыткой быть) по сравнению с s2. Он не компилируется по той же причине.

В 5 логические значения автоматически упаковываются из-за конкатенации строк.

6 снова полагается на приоритет оператора, упомянутый в 2; на этот раз это строка, true + " " + s1которая (ссылка) сравнивается с s2(и это дает ложь). Смотрите 5 для того, что происходит с true.

Автор: fge Размещён: 20.03.2014 07:32

0 плюса

1538 Репутация автора

What is the difference between (2) & (4)?

Ваше второе утверждение просто становится, System.out.println(hi == hihi ==hi);и ответ ложен, но ваше 4-е утверждение является прямым

 What is the difference between (3) & (5)?

Это так же, как ваш предыдущий вопрос

Why it gives result false in (3) & (6)? 

Ваше 3-е утверждение следует вышеупомянутому, где 6-е утверждение говорит как, System.out.println("true hi" =="hi");а вывод ложен

PS: оператор «+» стоит первым в предшествующем операторе

Автор: Siva Размещён: 20.03.2014 07:36

0 плюса

481 Репутация автора

1) В чем разница между (2) и (4)?

Ответ: - == имеет больший приоритет над +, так что 2nd фактически читается как "s1 == ((s2 + s1) == s2)", где мы даже не можем себе представить (булево + булево)

2) В чем разница между (3) и (5)?

Ответ: - 3-й даже не скомпилируется, а 5-й - простые положительные значения b1 = true и b2 = false и простая конкатенация строк выполнена

Автор: Mitul Gedeeya Размещён: 20.03.2014 11:15
Вопросы из категории :
32x32