2016-06-07 2 views
0

Недавно я исправил ошибку в программе C, где я был:старшинство оператора в C (! = И |)

if (foobar != FOO | BAR | BAZ) 

Правильный код

if (foobar != (FOO | BAR | BAZ)) 

Согласно C operator precedence оно ясно, что != имеет приоритет над |.

Мой вопрос, почему это так, а не наоборот? Из моего опыта я часто использую либо a == b || a == c, либо d == (a | b | c), но никогда не a == b | c == d.

Какова логика этого выбора?

+0

'foobar! = FOO | БАР | BAZ' эквивалентен '(foobar!= FOO) | БАР | BAZ', потому что прецедент '! =' Выше, чем '|'. Используйте его, если это то, что вы хотите. – MikeCAT

+0

Поскольку один является двоичным арифметическим оператором ('|') и, следовательно, принадлежит к тому же уровню, что и другие арифметические операторы, а другой - логический оператор ('||'). – m0skit0

+0

Потому что именно так решили разработчики языка. –

ответ

4

Он имеет исторические причины, цитаты из Dennis Ritchie:

«Early C не было никаких отдельных операторов для & и & & или | и ||. Вместо этого он использовал понятие (унаследованное от B и BCPL) значения истинности context ': где ожидалось булевское значение, после' if 'и' while ' и т. Д .; & и | операторы были интерпретированы как & & и || сейчас; в обычных выражениях использовались битовые интерпретации. Все получилось довольно неплохо, но было трудно объяснить. (В контексте истинностного значения было понятие «операторов верхнего уровня».) « приоритет & и | были такими, какие они есть сейчас.

В первую очередь по настоянию Алан Снайдер, & & и || операторов. Это успешно отделил понятия бит-операции и короткого замыкания Булевая оценка. Тем не менее, у меня были холодные ноги о старте проблемы. Например, там было много программ, с вещами, как: если (а == Ь & с == d) ...

«Оглядываясь назад, было бы лучше пойти вперед и изменить приоритет & к высшему чем ==, но это казалось безопаснее просто разделить & и & & без перемещения & мимо существующего оператора.»

0

Деннис Ритчи Development of the C Language охватывает эту и другие любопытные исторические артефакты.

В принципе, первоначально язык не имел && и || операторов - просто & и |, так что вы бы пишут такие вещи, как a == b | c == d. На основе этого были разработаны правила приоритета.

Позже были добавлены короткие операторы ciruiting, но приоритет старых операторов не был пересмотрен.

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