Приоритет оператора (поразрядно '&' ниже '==') - PullRequest
37 голосов
/ 13 января 2011

Почему в языке программирования C побитовые операторы (& и |) имеют меньший приоритет, чем оператор равенства (==)?Это не имеет смысла для меня.

Ответы [ 3 ]

50 голосов
/ 13 января 2011

Вам нужно спросить Брайана Кернигана или Денниса Ричи.
С этого форума: http://bytes.com/topic/c/answers/167377-operator-precedence

&& и || операторы были добавлены позже за их "короткое замыкание" поведение. Деннис Ричи признается в ретроспективно, что приоритет побитовых операторов должен иметь был изменен, когда были добавлены логические операторы. Но с несколькими сто килобайт исходного кода C, существующего на тот момент, и установил базу из трех компьютеров, Деннис думал, что это будет слишком большой изменения языка Си ...

Итак, это может быть причиной? Я предполагаю, что, поскольку существует несколько уровней побитового приоритета (в отличие от реляционных сравнений), что это бессмысленно, что существовало с тех пор ... всегда ... и просто никогда не исправлялось

16 голосов
/ 13 января 2011

Деннис Ритчи не имеет смысла, оглядываясь назад.

http://www.lysator.liu.se/c/dmr-on-or.html

&& и ||были добавлены к языку после |и &, и приоритет сохранялся по причинам совместимости.

4 голосов
/ 13 января 2011

У меня нет авторитетного ответа о том, почему K & R выбрал приоритет, который они сделали. Один пример, который имеет достаточное количество смысла, был бы следующим:

if (x == 1 & y == 0) {
    /* ... */
}

Поскольку это побитовый оператор AND, он использует режим оценки без короткого замыкания, как если бы

if (x == 1 | y == 0) {
    /* ... */
}

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

...