Könnte jemand erklären, warum Vergleichsoperatoren (==,! =, <,>, <=,> =) In einer Reihe der beliebtesten Sprachen (siehe Hinweis unten) eine höhere Priorität haben als bitweise Operatoren (&, |, ^) , ~)?
Ich glaube nicht, dass ich jemals auf eine Verwendung gestoßen bin, bei der dieser Vorrang natürlich wäre. Es ist immer so was wie:
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
Die Fälle, in denen ich verwenden würde:
flags = ( x == 6 | 2 ); // set bit 0 when x is 6, bit 1 always.
sind in der Nähe von nicht vorhanden.
Was war die Motivation der Sprachdesigner, sich für einen solchen Vorrang der Operatoren zu entscheiden?
Zum Beispiel sind alle Sprachen mit Ausnahme von SQL in den Top-12-Sprachen so wie in der Beliebtheitsliste für Programmiersprachen auf langpop.com: C, Java, C ++, PHP, JavaScript, Python, C #, Perl, SQL, Ruby, Shell, Visual Basic.
[arithmetics] [logic operator] [arithmetics]
. Die meisten Programmierer erzeugen kein Durcheinander von Klammern wie if(((x+getLowX()) < getMinX) || ((x-getHighX())>getMaxX())))
- die meisten nehmen an, dass Arithmetik Vorrang vor Logik hat, und schreiben if( ( x + getLowX() < getMinX ) || ( x - getHighX() > getMaxX() ))
unter der Voraussetzung, dass Vorrang vor der +
obigen <
. Nun if( x ^ getMask() != PATTERN )
sollte sich intuitiv das gleiche verhalten, wobei XOR der arithmetische Operator ist. Die Tatsache, dass es als if( x ^ ( getMask() != PATTERN ) )
völlig kontraintuitiv interpretiert wird.