2013-05-16 2 views
2

Может ли кто-нибудь объяснить логику выхода кода ниже?Условное поведение оператора

if(true||false&&false){ 
     System.out.println("right to left "); 
    } 
    if (false && true||true){ 
     System.out.println("left to right"); 
    } 
+7

&& имеет более высокий приоритет, чем ||, поэтому выражения в скобках, как '(истина || (ложь && ложь))' и ' ((false && true) || true) '. Оттуда вы сможете это исправить. – dlev

+0

Это правильно http://bmanolov.free.fr/javaoperators.php Само собой разумеется, что запись любого из них в реальной программе требует неприятностей; скобки всегда хороши –

ответ

5

Если вы посмотрите на this Operator precedence table, вы можете увидеть, что && имеет более высокий приоритет, чем ||.

Таким образом, эти два выражения вычисляются так:

true || false && false == true || (false && false) == true

false && true || true == (false && true) || true == true

+0

@ Keppil благодарит многих за объяснение этого очень простым способом. Очень простая вещь, но все же это заставило меня поцарапать голову на некоторое время. – user2388736

+0

Добро пожаловать. :) – Keppil

1

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; 
} 
+0

r u прост в использовании слева направо или справа налево. – user2388736

+0

@ user2388736 это как сказал Длев. Но после того, как вы завернете его в круглые скобки, он оценивает слева направо. –

+0

Хотел бы я знать, почему я встаю и спускаюсь с ума, как сумасшедший. Кто-то дает основания для downvotes. –

1

Java дает различный приоритет оператора к && и || , Это означает, что ваши выражения могут быть написаны как true || (false && false) и (false && true) || true. Когда вы видите «или true» в логическом выражении, это всегда верно. Вот почему печатаются обе строки.

Если вы хотите, чтобы ваши выражения были четкими, вы всегда можете положить скобки вокруг частей x && y.

0

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

|| (или) - добавление

& & (а) - умножение

, поэтому & & имеет более высокий приоритет, чем ||

Итак, очередность выражение равен:

true + (false * false) и (false * true) + true

Смежные вопросы