Qualcuno potrebbe spiegare la logica, perché in un gruppo di lingue più popolari (vedi nota sotto) gli operatori di confronto (==,! =, <,>, <=,> =) Hanno una priorità maggiore rispetto agli operatori bit a bit (&, |, ^ , ~)?
Non credo di aver mai incontrato un uso in cui questa precedenza sarebbe naturale. È sempre roba del tipo:
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
I casi in cui userei:
flags = ( x == 6 | 2 ); // set bit 0 when x is 6, bit 1 always.
sono quasi inesistenti.
Qual è stata la motivazione dei progettisti del linguaggio a decidere su tale precedenza degli operatori?
Ad esempio, tutti tranne SQL nelle prime 12 lingue sono simili a quelli nell'elenco di Popolarità del linguaggio di programmazione su langpop.com: C, Java, C ++, PHP, JavaScript, Python, C #, Perl, SQL, Ruby, Shell, Visual Basic.
[arithmetics] [logic operator] [arithmetics]
. La maggior parte dei programmatori non crea un pasticcio di parentesi come if(((x+getLowX()) < getMinX) || ((x-getHighX())>getMaxX())))
- la maggior parte assumerà la precedenza dell'aritmetica sulla logica e scriverà if( ( x + getLowX() < getMinX ) || ( x - getHighX() > getMaxX() ))
assumendo la precedenza di cui +
sopra <
. Ora intuitivamente if( x ^ getMask() != PATTERN )
dovrebbe comportarsi allo stesso modo, XOR essendo un operatore aritmetico. Il fatto che sia interpretato come if( x ^ ( getMask() != PATTERN ) )
completamente controintuitivo.