Булевы логические выражения в Java - PullRequest
1 голос
/ 05 октября 2019

Может ли какая-нибудь добрая душа объяснить, почему

! (x < 0 && y < 0) 

не эквивалентно следующим двум выражениям

!(x < 0) && ! (y < 0)       AND       x > 0 && y > 0

В первом коде это не означает, что x не являетсяменьше 0 и у не меньше 0? и не означает ли это, что x и y должны быть больше 0? Любая помощь очень ценится!

Ответы [ 3 ]

1 голос
/ 05 октября 2019

Давайте вычислим эквивалентное выражение для ! (x < 0 && y < 0)

Обратите внимание, что если отрицание предшествует &&, оно становится ||и наоборот. поэтому ваше выражение будет равно:

! (x < 0 && y < 0) ---> !(x<0) || !(y<0) ---> x>=0 || y>=0

это как на рисунке ниже, цветная область - результат вашего выражения: enter image description here

1 голос
/ 05 октября 2019

В двух ваших переписанных версиях вам понадобится ИЛИ (||), а не И (&&). Это верно в любое время, когда вы инвертируете составные части условия AND.

! (x < 0 && y < 0) равно true, если x равно >= 0 и y равно < 0. Чтобы получить тот же результат в другой форме, вам понадобится x >= 0 || y >= 0. (Обратите внимание, что это >=, а не просто >, но основной смысл был ||, а не &&.)

Как указывает ernest_k, это одно конкретное применение Законы де Моргана .

0 голосов
/ 05 октября 2019

В первом примере оба выражения в скобках ("(x <0)" и "(y <0)") должны быть равны "true", чтобы все выражение стало "false". </p>

Во втором примере первые два выражения содержат каждое из выражений, которые заключены в квадратные скобки первого примера («(x <0)» и «(y <0)»). Таким образом, только одно из этих выражений, являющихся «истинными», может привести к тому, что все выражение станет «ложным», поскольку все связано с операторами AND. </p>

Вы можете установить x = 0 и y = -1 и попробовать его. вручную.

Вам также может быть интересно посмотреть на https://en.wikipedia.org/wiki/De_Morgan's_laws

...