Почему в Java есть 2 оператора логического типа?

Как сказано в мышлении на Java, если у вас есть 2 логических объекта, x и y, вы можете использовать для них либо x= x&&y, либо x=x&y, так почему необходимо иметь оба типа?


person Eduardo EPF    schedule 26.11.2012    source источник
comment
См. также: title="в каких случаях лучше использовать безусловное и вместо"> stackoverflow.com/questions/11411907/   -  person assylias    schedule 26.11.2012


Ответы (4)


Два оператора действуют по-разному:

  • & всегда будет оценивать оба операнда
  • && короткое замыкание: если первый операнд оценивается как false, то общий результат всегда будет ложным, а второй операнд не оценивается.

Дополнительные сведения см. в Спецификации языка Java:

person Jon Skeet    schedule 26.11.2012
comment
+1, кроме того, форма короткого замыкания - это почти всегда то, что вы захотите использовать. Это особенно полезно для избегания NPE, например: if (someVar != null && someVar.getSomeProp() == 1) { ... } - person ach; 26.11.2012

Посмотрите на вывод этого кода:

    int x = 0;
    boolean b = false & (++x == 1); // b is false
    System.out.println(x); // prints 1
    x = 0;
    b = false && (++x == 1); // b is false
    System.out.println(x); // prints 0

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

person jlordo    schedule 26.11.2012

  1. & будет оценивать оба операнда
  2. && пропустит оценку второго операнда, если первый операнд ложен
person PermGenError    schedule 26.11.2012
comment
@GanGnaMStYleOverFlowErroR Я соблазняюсь. - person John Dvorak; 26.11.2012

& — побитовый оператор «и», && — логический оператор «и».

& всегда будет оценивать как левую, так и правую стороны, && будет оценивать только левую, если этого достаточно для оценки выражения (например, false && true : оценивается только левая сторона, потому что, если левая сторона ложна, все выражение должно быть ложным)

person NickJ    schedule 26.11.2012