Приоритет оператора (побитовый '&' ниже, чем '==')

На языке программирования 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) {
    /* ... */
}

используйте оператор короткого замыкания ИЛИ. Вероятно, поэтому они выбрали группу приоритетов таким образом, но я согласен с вами в том, что ретроспективно это не кажется хорошей идеей.