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 jak if(((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 intuicyjnie if( x ^ getMask() != PATTERN )
powinien zachowywać się tak samo, XOR jest operatorem arytmetycznym. Fakt, że jest interpretowany jako if( x ^ ( getMask() != PATTERN ) )
całkowicie sprzeczny z intuicją.