На языке программирования C, почему побитовые операторы (& и |) имеют более низкий приоритет, чем оператор равенства (==)? Для меня это не имеет смысла.
Приоритет оператора (побитовый '&' ниже, чем '==')
Ответ 1
Вам нужно спросить Брайана Кернигана или Денниса Ричи.
С этого форума: http://bytes.com/topic/c/answers/167377-operator-precedence
& & и || операторы были добавлены позже за их "короткое замыкание" поведения. Деннис Ритчи допускает ретроспективно, что приоритет побитовых операторов должен иметь были изменены при добавлении логических операторов. Но с несколькими сто килобайт исходного кода C, существовавших в этой точке, и установленная база из трех компьютеров, Деннис считал, что это будет слишком большой изменения языка C...
Итак, это может быть причиной? Я предполагаю, что есть несколько уровней поразрядной оценки (в отличие от реляционных сравнений), которые он прорывал, что существовал с тех пор... навсегда... и просто не был исправлен.
Ответ 2
Это также не имеет смысла для Денниса Ритчи, в ретроспективе.
http://www.lysator.liu.se/c/dmr-on-or.html
& & и || были добавлены на язык после | и &, и приоритет поддерживали по соображениям совместимости.
Ответ 3
У меня нет авторитетного ответа относительно того, почему K & R выбрали приоритет, который они сделали. Одним из примеров, который будет иметь большой смысл, будет следующий:
if (x == 1 & y == 0) {
/* ... */
}
Так как это побитовый оператор И, он использует режим оценки без короткого замыкания, как и
if (x == 1 | y == 0) {
/* ... */
}
используйте оператор короткого замыкания ИЛИ. Вероятно, поэтому они выбрали группу приоритетов таким образом, но я согласен с вами в том, что ретроспективно это не кажется хорошей идеей.