Приоритет булевых операторов
Я хотел бы знать, зависит ли приоритет оператора в языках программирования от реализации или существует фиксированное правило, которому следуют все языки. И если возможно, не могли бы вы сначала заказать следующие операторы с наивысшим приоритетом: 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