Czy ktoś mógłby wyjaśnić uzasadnienie, dlaczego w wielu najpopularniejszych językach (patrz uwaga poniżej) operatory porównania (==,! =, <,>, <=,> =) Mają wyższy priorytet niż operatory bitowe (&, |, ^ , ~)?
Nie sądzę, że kiedykolwiek spotkałem się z zastosowaniem, w którym ten priorytet byłby naturalny. Zawsze są takie rzeczy jak:
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
Przypadki, w których użyłbym:
flags = ( x == 6 | 2 ); // set bit 0 when x is 6, bit 1 always.
są prawie nieistniejące.
Jaka była motywacja projektantów języków do decydowania o takim priorytecie operatorów?
Na przykład wszystkie oprócz SQL w 12 najpopularniejszych językach są takie jak na liście Popularność języków programowania na langpop.com: C, Java, C ++, PHP, JavaScript, Python, C #, Perl, SQL, Ruby, Shell, Visual Basic.
[arithmetics] [logic operator] [arithmetics]
. Większość programistów nie tworzy bałaganu w nawiasach, takich jakif(((x+getLowX()) < getMinX) || ((x-getHighX())>getMaxX())))
- większość przyjmuje pierwszeństwo arytmetyki przed logiką i pisze,if( ( x + getLowX() < getMinX ) || ( x - getHighX() > getMaxX() ))
zakładając pierwszeństwo+
powyżej<
. Teraz intuicyjnieif( x ^ getMask() != PATTERN )
powinien zachowywać się tak samo, XOR jest operatorem arytmetycznym. Fakt, że jest interpretowany jakoif( x ^ ( getMask() != PATTERN ) )
całkowicie sprzeczny z intuicją.Odpowiedzi:
Języki skopiowały to z C, a dla C Dennis Ritchie wyjaśnia, że początkowo w B (i być może wczesnym C) istniała tylko jedna forma,
&
która w zależności od kontekstu działała nieco lub logicznie. Później każda funkcja ma swojego operatora:&
dla bitowego i&&
dla logicznego. Potem kontynuujeźródło
c=2
Luba==b
skutkowało,~0
a nie1
?Operatory bitowe są powiązane z operatorami logicznymi zarówno koncepcyjnie, jak i pod względem wyglądu, co prawdopodobnie wyjaśnia, dlaczego są blisko siebie w tabeli pierwszeństwa. Być może można nawet argumentować, że byłoby mylące, ponieważ
&
być wyższym niż==
, ale&&
być niższym wtedy==
.Po ustaleniu precedensu precedensu (!) Prawdopodobnie dla lepszej spójności inne języki powinny go stosować.
Jednak zgadzam się z tobą, że nie jest to optymalne. W rzeczywistości operatory bitowe bardziej przypominają operatory matematyczne niż logiczne i byłoby lepiej, gdyby były zgrupowane z operatorami matematycznymi w pierwszej kolejności.
źródło