Булева функциональность в Java
172 просмотра
3 ответа
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)?
Ответы (3)
12 плюса
За исключением 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 - ошибка, поскольку +
оператор не принимает boolean
s в качестве операндов.
3 читается почти так же, как 2, за исключением того, что на этот раз это s2 + " " + s1
(с попыткой быть) по сравнению с s2
. Он не компилируется по той же причине.
В 5 логические значения автоматически упаковываются из-за конкатенации строк.
6 снова полагается на приоритет оператора, упомянутый в 2; на этот раз это строка, true + " " + s1
которая (ссылка) сравнивается с s2
(и это дает ложь). Смотрите 5 для того, что происходит с true
.
0 плюса
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:360 плюса
1) В чем разница между (2) и (4)?
Ответ: - == имеет больший приоритет над +, так что 2nd фактически читается как "s1 == ((s2 + s1) == s2)", где мы даже не можем себе представить (булево + булево)
2) В чем разница между (3) и (5)?
Ответ: - 3-й даже не скомпилируется, а 5-й - простые положительные значения b1 = true и b2 = false и простая конкатенация строк выполнена
Автор: Mitul Gedeeya Размещён: 20.03.2014 11:15Вопросы из категории :
- java В чем разница между int и Integer в Java и C #?
- java Как я могу определить IP моего маршрутизатора / шлюза в Java?
- java Каков наилучший способ проверки XML-файла по сравнению с XSD-файлом?
- java Как округлить результат целочисленного деления?
- java Преобразование списка <Integer> в список <String>
- string В чем разница между строкой и строкой в ??C #?
- string Почему в Ruby нет реального StringBuffer или StringIO?
- string Преобразовать строку в перечисление в C #
- string Самый эффективный способ объединения строк?
- boolean Использование сравнений OR с операторами IF
- boolean Самый простой способ переключить логическую переменную в Java?
- boolean Двойное отрицание в коде C ++
- boolean Булевы выражения в Java
- boolean Как использовать логические переменные в Perl?
- println Разделение целых чисел на Java
- println println в Scala для понимания
- println java.lang.NullPointerException: println нуждается в сообщении
- println Java печать строки, содержащей целое число
- println В чем разница между fmt.Println () и println () в го