Express таблица истинности, использующая одно условие if - PullRequest
0 голосов
/ 22 марта 2020

Мой код выглядит так:

/*
 * A B
 * 0 0 -> 1
 * 0 1 -> 0
 * 1 0 -> 0
 * 1 1 -> 0
 */

#define A condition_1
#define B condition_2

if (A) {
    // do nothing
} else {
    if (B) {
        // do nothing
    } else {
        // do something
    }
}

Выше я сообщил таблицу истинности для двух условий, где 1 равно true и 0 равно false, есть ли способ express таблица истинности в одном условии if?

Ответы [ 3 ]

5 голосов
/ 22 марта 2020

Ваша таблица истинности представляет собой операцию NOR (не или). Вы можете легко получить это, комбинируя логическое НЕ (!) с логическим ИЛИ (||)

if (!(A || B)) {

}

PS. Пожалуйста, не используйте #define макросы. Это очень подвержено ошибкам и имеет тенденцию кусать программистов, которые его используют. Чаще всего существуют более безопасные и удобочитаемые способы выполнения макроса.

4 голосов
/ 22 марта 2020

Использование:

if (!A && !B) {
    // do something
}

Подумайте, ваша таблица истинности возвращает 1 только когда оба условия ложны (0 0 -> 1). Вы можете использовать ! в обоих случаях, чтобы инвертировать его.

1 голос
/ 22 марта 2020

Если в таблице только один 1, то это по сути операция И. Если есть только один 0, то это операция ИЛИ. Если их обоих два, вы можете сделать это операцией равенства.

Когда вы знаете, какую операцию выбрать для следующего шага, нужно выяснить, какие операнды должны быть отменены. Для И оба операнда должны повернуться к 1, чтобы произвести 1 (1 И 1 = 1), поэтому отрицайте тех, кто иначе бы получил 0. Для ИЛИ наоборот, отрицайте тех, кто получит 1, пытаясь получить 0 в качестве результата (0 ИЛИ 0 = 0)

Для операции равенства следует помнить, что bool может быть true или false, поэтому существует только два значения. Если вы попытаетесь использовать что-то, что не является bool для логического операнда, тогда будут проблемы. Имея это в виду, когда вы хотите получить равенство, отмените любой из операндов, если изначально они не дают правильный результат (0 == 0 = 1, а также 1 == 1 = 1, если вы меня понимаете).

В вашем конкретном случае у нас есть только одна 1 в таблице, так что это операция AND. Оба операнда равны 0 для этого 1 результата, поэтому мы должны отрицать оба из них:

!A && !B
...