использование && и | операторы вместе в выражении

cond && cond op cond

op может быть && или ||

Qn- Для оператора короткого замыкания (&&), если первое условие ложно, правая часть (целое) не оценивается или только второе условие после && не оценивается.

Также почему результат следующих двух выражений отличается?

(2 > 3 && 5 < 2 || 3 > 2) => True

(2 > 3 && 5 < 2 | 3 > 2) => False

Разве мы не можем использовать оператор короткого замыкания и стандартные операторы в одном выражении...?


person PRAKHAR SHARMA    schedule 11.12.2012    source источник


Ответы (2)


Результаты отличаются, потому что | и || имеют разный приоритет.

В частности, | имеет более высокий приоритет, чем &&, тогда как || имеет более низкий приоритет, чем &&.

          System.out.println(2 > 3 && 5 < 2 || 3 > 2);    // true
          System.out.println(2 > 3 && 5 < 2 | 3 > 2);     // false
          System.out.println(2 > 3 && (5 < 2 | 3 > 2));   // false
          System.out.println((2 > 3 && 5 < 2) | (3 > 2)); // true
person NPE    schedule 11.12.2012
comment
спасибо .. есть ли проблемы с использованием | или & как логические операторы? - person PRAKHAR SHARMA; 12.12.2012
comment
Не то, чтобы я знал об этом, но вы должны быть осторожны, потому что, как только вы попадете в различные приоритеты, вы должны убедиться, что знаете, что идет первым и как это будет прочитано сервером. - person Felix Guo; 12.12.2012
comment
@PRAKHARSHARMA Я бы не рекомендовал использовать | и & в качестве логических операторов, потому что 1) они не замыкаются, поэтому код будет выполняться без необходимости, и 2) большинство людей не используют их таким образом, поэтому ваш код будет нетрадиционный. - person matts; 12.12.2012
comment
Я только что задал аналогичный вопрос и получил достойные ответы: в java">stackoverflow.com/questions/15089890/ Короче говоря, большинство людей согласны с тем, что использование | и & для обеспечения соблюдения бизнес-логики может привести к ошибкам и нечистому коду. Так что не рекомендуется, в некоторых редких случаях есть полезное использование. - person CsBalazsHungary; 26.02.2013

Ваши результаты отличаются, потому что во втором случае используется | вместо ||. | является побитовым или, которое отличается от логического или.

Теперь вы говорите, что выражения короткого замыкания против стандартных выражений, но во многих языках выражения короткого замыкания являются стандартными (или единственным способом) вычисления логических выражений.

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

person RonaldBarzell    schedule 11.12.2012
comment
я согласен, что | это побитовый оператор, но его также можно использовать как не короткое замыкание. Я ошибаюсь? - person PRAKHAR SHARMA; 12.12.2012
comment
Хорошо ... Я рекомендую не использовать стандарт, потому что, если что, короткое замыкание является стандартом. Кроме того, не думайте о | как без короткого замыкания. Он делает что-то другое, чем ||. - person RonaldBarzell; 12.12.2012