Оператор в программировании имеет два значения в математической логике. Первый - это равенство между элементами домена =
. Вторая - двойная импликация ↔
. Это потому, что вы можете сравнивать числа с ==
так же, как вы можете сравнить значения boolean с ==
.
В математической логике, =
может сравнивать значения только в области, так a = b
всегда логическое выражение, в то время как a
и b
нет. Однако, если мы посмотрим на a ↔ b
, то a ↔ b
, a
и b
являются булевыми выражениями. Таким образом, not a ↔ b
означает (not a) ↔ b
и not a = b
означает not (a = b)
.
Однако, поскольку =
и ↔
представлены одним и тем же оператором ==
в большинстве языков программирования, то по крайней мере очень трудно, и, вероятно, не интуитивное реализовать различные правила точности для ==
, когда она используется по-разному.
Причина, по которой это трудно реализовать, объясняется тем, что в синтаксическом анализаторе обычно выполняется приоритет оператора. Когда парсер перевел исходный код в дерево синтаксиса, приоритет оператора уже закодирован в дереве. Проверка типа (если есть) работает с деревом синтаксиса. Таким образом, анализатор не имеет доступа к информации о типе, которая подразумевает, что он не может использовать информацию типа для применения различных правил приоритета.
Это, вероятно, упрощает анализ, если все унарные префиксные операторы имеют одинаковый (высокий) приоритет. – melpomene
Также обратите внимание, что вы можете запутаться - у Lua нет никаких [операторов] (https://www.lua.org/manual/5.3/manual.html#3.4.5) (унарных или двоичных), которые принимают только логические значения _and_ возвращают только булевы значения. 'not' принимает значение любого типа, но возвращает только логические значения.('и' и 'или' являются селекторами.) –