Может ли кто-нибудь объяснить обоснование, почему в группе самых популярных языков (см. Примечание ниже) операторы сравнения (==,! =, <,>, <=,> =) Имеют более высокий приоритет, чем побитовые операторы (&, |, ^ ~)
Я не думаю, что я когда-либо сталкивался с использованием, где этот приоритет был бы естественным. Это всегда такие вещи, как:
if( (x & MASK) == CORRECT ) ... // Chosen bits are in correct setting, rest unimportant
if( (x ^ x_prev) == SET ) // only, and exactly SET bit changed
if( (x & REQUIRED) < REQUIRED ) // Not all conditions satisfied
Случаи, когда я бы использовал:
flags = ( x == 6 | 2 ); // set bit 0 when x is 6, bit 1 always.
близки к несуществующему.
Какова была мотивация дизайнеров языка, чтобы принять решение о таком приоритете операторов?
Например, все, кроме SQL в топ-12 языков, аналогичны спискам популярности языков программирования на langpop.com: C, Java, C ++, PHP, JavaScript, Python, C #, Perl, SQL, Ruby, Shell, Visual Basic.
language-design
syntax
operators
bitwise-operators
operator-precedence
Научная фантастика
источник
источник
[arithmetics] [logic operator] [arithmetics]
. Большинство программистов не создают беспорядок в скобках, какif(((x+getLowX()) < getMinX) || ((x-getHighX())>getMaxX())))
большинство - большинство будет принимать арифметику над логикой и писать,if( ( x + getLowX() < getMinX ) || ( x - getHighX() > getMaxX() ))
предполагая приоритет+
выше<
. Теперь интуитивноif( x ^ getMask() != PATTERN )
следует вести себя так же, XOR является арифметическим оператором. Факт, что это интерпретируется какif( x ^ ( getMask() != PATTERN ) )
полностью нелогичное.Ответы:
Языки скопировали это из C, а для C Деннис Ричи объясняет, что изначально, в B (и, возможно, в раннем C), была только одна форма,
&
которая в зависимости от контекста делалась побитовой и / или логической. Позже каждая функция получила свой оператор:&
для побитовой и&&
для логической. Затем он продолжаетисточник
c=2
Илиa==b
приведет к~0
и нет1
?Битовые операторы связаны с логическими операторами как концептуально, так и по внешнему виду, что, вероятно, объясняет, почему они находятся рядом друг с другом в таблице приоритетов. Возможно, можно даже утверждать, что было бы непонятно,
&
чтобы быть выше==
, но&&
быть ниже==
.После того, как был установлен прецедент приоритета (!), Для других языков, вероятно, было бы лучше следовать ему для согласованности.
Однако я склонен согласиться с вами, что это не оптимально. В реальном использовании битовые операторы больше похожи на математические операторы, чем на логические, и было бы лучше, если бы они были сгруппированы с математическими операторами в приоритете.
источник