Может ли кто-нибудь объяснить логику выхода кода ниже?Условное поведение оператора
if(true||false&&false){
System.out.println("right to left ");
}
if (false && true||true){
System.out.println("left to right");
}
Может ли кто-нибудь объяснить логику выхода кода ниже?Условное поведение оператора
if(true||false&&false){
System.out.println("right to left ");
}
if (false && true||true){
System.out.println("left to right");
}
Если вы посмотрите на this Operator precedence table, вы можете увидеть, что &&
имеет более высокий приоритет, чем ||
.
Таким образом, эти два выражения вычисляются так:
true || false && false
== true || (false && false)
== true
false && true || true
== (false && true) || true
== true
@ Keppil благодарит многих за объяснение этого очень простым способом. Очень простая вещь, но все же это заставило меня поцарапать голову на некоторое время. – user2388736
Добро пожаловать. :) – Keppil
if(true||false&&false)
может быть упрощен до истины, поэтому печатает линию. Это можно упростить до истины, потому что у вас есть true
с левой стороны. Поскольку справа есть или/||
, и все уже верно, это означает, что он может коротко замыкаться и не оценивать остальное. Вы можете доказать это сами, взяв false&&false
, поместив его в свой собственный метод, а затем распечатав строку до ее возвращения. Вы увидите, что он не печатает. Это потому, что (false && false)
даже не оценивается.
false && true||true
можно упростить до true, чтобы печатать строку. Значение false && true
оценивается как ложное, но так как есть или осталось, он оценивает другую сторону. Это оказалось правдой. Начиная с false||true
== true
, который оценивается как true. Здесь нет короткого замыкания. Вы можете это доказать, извлекая false && true
в свой собственный метод и напечатав что-то на первой строке. Вы увидите, что она печатает:
public static void main(String args[]) {
if(true|| doSomething()){
System.out.println("right to left ");
}
if (doSomethingElse() ||true){
System.out.println("left to right");
}
}
private static boolean doSomething() {
System.out.println("do something"); //this does NOT print
return false&&false;
}
private static boolean doSomethingElse() {
System.out.println("do something else"); //this DOES print
return false && true;
}
r u прост в использовании слева направо или справа налево. – user2388736
@ user2388736 это как сказал Длев. Но после того, как вы завернете его в круглые скобки, он оценивает слева направо. –
Хотел бы я знать, почему я встаю и спускаюсь с ума, как сумасшедший. Кто-то дает основания для downvotes. –
Java дает различный приоритет оператора к &&
и ||
, Это означает, что ваши выражения могут быть написаны как true || (false && false)
и (false && true) || true
. Когда вы видите «или true» в логическом выражении, это всегда верно. Вот почему печатаются обе строки.
Если вы хотите, чтобы ваши выражения были четкими, вы всегда можете положить скобки вокруг частей x && y
.
Прежде всего, если случаи исключены во время компиляции, если результат постоянный.
|| (или) - добавление
& & (а) - умножение
, поэтому & & имеет более высокий приоритет, чем ||
Итак, очередность выражение равен:
true + (false * false)
и (false * true) + true
&& имеет более высокий приоритет, чем ||, поэтому выражения в скобках, как '(истина || (ложь && ложь))' и ' ((false && true) || true) '. Оттуда вы сможете это исправить. – dlev
Это правильно http://bmanolov.free.fr/javaoperators.php Само собой разумеется, что запись любого из них в реальной программе требует неприятностей; скобки всегда хороши –