Я пишу небольшой синтаксический анализатор, который будет иметь оператор OR и оператор AND. Когда вы видите серию OR и AND, что, по вашему мнению, будет более обязательным? Учитывая выражение a & b | c, ожидаете ли вы, что оно будет означать (a&b)|c или a&(b|c)? Можете ли вы дать какие-либо основания для предпочтения одного над другим?
a & b | c
(a&b)|c
a&(b|c)
AND и OR в булевой алгебре эквивалентны * и - в регулярной алгебре, поэтому имеет смысл, что AND связывает сильнее, чем OR точно так же, как * связывает сильнее, чем +:
A B A*B A&B A+B A|B 0 0 0 0 0 0 0 1 0 0 1 1 1 0 0 0 1 1 1 1 1 1 1(>0) 1
Делай то, что делают все остальные;AND связывается сильнее, чем OR (см., Например, Таблица приоритетов операторов ).Это соглашение, которого все ожидают, поэтому примите принцип наименьшего удивления .
Этот выбор не является произвольным.Это связано с тем, что AND и OR следуют аналогичным отношениям для умножения и сложения соответственно;см., например, http://en.wikipedia.org/wiki/Boolean_logic#Other_notations.
Обратите внимание, что пользователям вашего языка следует настоятельно рекомендовать использовать скобки, чтобы их намерения были понятны читателям их кода.Но это до них!
Обычно & имеет приоритет над |во многих сценариях.Но вы можете ограничить выражения выражением в круглых скобках.
Если вы считаете это так, как если бы вы разделили математику, я бы сказал, что PEMDAS заставляет вас сказать, что AND является более обязательным. Это не всегда так.
Я рекомендую вам рекомендовать своим пользователям использовать круглые скобки там, где есть двусмысленность.