Приоритет булевых операторов

Я хотел бы знать, зависит ли приоритет оператора в языках программирования от реализации или существует фиксированное правило, которому следуют все языки. И если возможно, не могли бы вы сначала заказать следующие операторы с наивысшим приоритетом: AND, OR, NOT, XOR.

5 ответов

Решение

Я гуглил и обнаружил, что это говорит о том, что некоторые языки, такие как APL и SmallTalk, не имеют правил приоритета операторов, и они строго оценивают выражения слева направо / слева направо.

Однако, относительный порядок следования приоритета НЕ> XOR > И> ИЛИ в большинстве языков, особенно тех, которые происходят от C

Вы видели это, когда выражения смешиваются && с || эта оценка должна быть сделана в правильном порядке. Круглые скобки могут использоваться для группировки операндов по их правильному оператору, как в арифметике. Также как и арифметические операторы, логические операторы имеют приоритет, который определяет, как все сгруппировано в отсутствие круглых скобок.

В выражении оператор с наивысшим приоритетом группируется сначала с операндами, затем следующий наивысший оператор группируется с операндами и т. Д. Если есть несколько логических операторов одного и того же приоритета, они будут рассмотрены слева направо.

Программисты часто используют круглые скобки, чтобы сгруппировать операнды для удобства чтения, даже когда сработает только приоритет оператора.

Источник

Простой тест на Java, и это правда:

@Test
public void booleanPrecedenceTest() {
    boolean A = true, B = false, C = true, D = false;
    Assert.assertTrue((A || B && C) == (A || (B && C)));
    Assert.assertTrue((A && B || C && D) == ((A && B) || (C && D)));
    Assert.assertTrue((A && B && C || D) == (((A && B) && C) || D));
    Assert.assertTrue((!A && B || C) == (((!A) && B) || C));
}

Логическое или битовое? Не существует фиксированного правила, большинство языков имеют похожие правила, но отличаются в деталях. Посмотрите это в определении языка.

Существует три основных логических оператора: NOT, AND, OR. XOR - это просто простая версия A AND NOT B OR NOT A AND B или же (A OR NOT B) AND (NOT A OR B), Таким образом, только эти три имеют общий приоритет: НЕ> И> ИЛИ. XOR имеет другую позицию в языках, но он, безусловно, имеет не более высокий приоритет, чем AND, и не ниже OR. Большинство языков (например, C/C++/Javascript и т. Д.) Имеют его между AND и OR, но в других (например, Perl) XOR имеет тот же приоритет, что и OR.

(ИЛИ можно выразить, используя только И и НЕ, но это все еще основной оператор: A OR B = NOT(NOT A AND NOT B))

Очевидный и простой способ доказать, что AND имеет более высокий приоритет, чем OR, - это сравнить результаты операторов со скобками и без них:

      std::cout << std::boolalpha;
std::cout << ( true || false && false )     << std::endl;   // gives true
std::cout << ( ( true || false ) && false ) << std::endl;   // gives false
Другие вопросы по тегам