2016-11-07 3 views
4

Кто-нибудь знает, почему «boolean not» имеет более высокий приоритет, чем == в порядке операций для большинства языков программирования?Порядок действий (== vs. not)

В математической логике/теории моделей, не так ли? Я недавно писал в Lua:

if not 1 == 2 then 
    print("hi") 
end 

Это не печатает «привет» из-за порядка операций между не и ==, который кажется странным мне.

+0

Это, вероятно, упрощает анализ, если все унарные префиксные операторы имеют одинаковый (высокий) приоритет. – melpomene

+1

Также обратите внимание, что вы можете запутаться - у Lua нет никаких [операторов] (https://www.lua.org/manual/5.3/manual.html#3.4.5) (унарных или двоичных), которые принимают только логические значения _and_ возвращают только булевы значения. 'not' принимает значение любого типа, но возвращает только логические значения.('и' и 'или' являются селекторами.) –

ответ

1

Необходимо провести различие между not 1 == 2 и not (1 == 2). Последний ведет себя так, как вы ожидаете; первый - унарный not, применяемый только к 1, который, вероятно, производит нуль.

Это не отличается от «математической теории/теории моделей».

+0

В математической логике« 1 == 2 »считается атомным предложением, а« нет »- логическим соединением. Сначала оценивается значение истинности всех атомных предложений, затем применяются логические связки. [Https://en.wikipedia.org/wiki/T-schema#The_inductive_definition](https://en.wikipedia.org/wiki/T-schema#The_inductive_definition). Вот что я имел в виду, когда сказал, что это отличается от математической логики. – Mike

+0

Я изучал математическую логику в течение пяти лет, и я не согласен. – EJP

+2

В Lua 'not 1' оценивается как' false', который отличается от '2', следовательно, нет вывода. – lhf

5

Нет необходимости отрицать оператор отношения, поскольку каждый из них имеет противоположный оператор. Например, мы имеем операторы равенства и неравенства (ваш пример мог быть написан 1 ~= 2). Унарные операторы в большинстве языков программирования имеют наивысший приоритет, потому что самый того времени, который приводит к получению кода, который больше напоминает естественный язык.

Например, not green and not blue должно означать «ни зеленый, ни синий». Очень низкий приоритет для not превратил бы это в нечто вроде not (green and not blue), о котором намного сложнее понять.

0

Оператор в программировании имеет два значения в математической логике. Первый - это равенство между элементами домена =. Вторая - двойная импликация . Это потому, что вы можете сравнивать числа с == так же, как вы можете сравнить значения boolean с ==.

В математической логике, = может сравнивать значения только в области, так a = b всегда логическое выражение, в то время как a и b нет. Однако, если мы посмотрим на a ↔ b, то a ↔ b, a и b являются булевыми выражениями. Таким образом, not a ↔ b означает (not a) ↔ b и not a = b означает not (a = b).

Однако, поскольку = и представлены одним и тем же оператором == в большинстве языков программирования, то по крайней мере очень трудно, и, вероятно, не интуитивное реализовать различные правила точности для ==, когда она используется по-разному.

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

Смежные вопросы