Сложное условие - PullRequest
0 голосов
/ 19 января 2012

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

if (!m_bMsOcs && bChannelData || m_bMsOcs && !bStunType)

Я предполагаю, что предполагаемое условие было

if ((!m_bMsOcs && bChannelData) || (m_bMsOcs && !bStunType))

Я не уверен.Как должно выполняться оригинальное условное выражение?Пожалуйста, помогите.

Ответы [ 6 ]

3 голосов
/ 19 января 2012

приоритет логических операторов:

! > && > ||

так что ваше предположение верно.

3 голосов
/ 19 января 2012
if ( ((!m_bMsOcs) && bChannelData) || (m_bMsOcs && (!bStunType)) ) 

Оператор имеет приоритет !> &&> ||

1 голос
/ 19 января 2012

Логические and имеют более высокий приоритет, чем or: ссылка

Так что вы правы в логике.

1 голос
/ 19 января 2012

Это вопрос приоритета оператора.Скобки имеют приоритет, следуют ваши логики.Поскольку && имеет больший приоритет, чем ||, вы правы в своем предположении.

0 голосов
/ 19 января 2012

Как уже говорили другие, два выражения эквивалентны из-за правил приоритета C ++.

Вот таблица истинности, которая может помочь прояснить, что произойдет (я согласен, что условное выражение сложнее, чемнапример, тоже):

m_bMsOcs    bChannelData    bStunType       Execute?
========    ============    =========       ========
    0             0             0
    0             0             1
    0             1             0               Y
    0             1             1               Y

    1             0             0               Y
    1             0             1
    1             1             0               Y
    1             1             1

Обратите внимание, что 1 и 0 в таблице просто представляют значения true / false (т. е. переменные не должны иметь значенияиз 1 - любое ненулевое значение будет рассматриваться как 1).Я просто нахожу таблицу более удобочитаемой, используя 0 / 1 вместо T / F.

0 голосов
/ 19 января 2012

Ваш ответ правильный:)

Если (то и то) или (то и то)

Так что, если любой из ands правильный, он оценивает true

...