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 wieif(((x+getLowX()) < getMinX) || ((x-getHighX())>getMaxX())))
- die meisten nehmen an, dass Arithmetik Vorrang vor Logik hat, und schreibenif( ( x + getLowX() < getMinX ) || ( x - getHighX() > getMaxX() ))
unter der Voraussetzung, dass Vorrang vor der+
obigen<
. Nunif( x ^ getMask() != PATTERN )
sollte sich intuitiv das gleiche verhalten, wobei XOR der arithmetische Operator ist. Die Tatsache, dass es alsif( x ^ ( getMask() != PATTERN ) )
völlig kontraintuitiv interpretiert wird.Antworten:
Sprachen haben das von C kopiert, und für C erklärt Dennis Ritchie , dass es anfangs in B (und vielleicht in frühem C) nur eine Form gab,
&
die je nach Kontext eine bitweise und / oder eine logische Form hatte . Später bekam jede Funktion ihren Operator:&
für die bitweise und&&
für die logische. Dann fährt er fortquelle
c=2
Oder dazua==b
führen würde~0
und nicht1
?Bitweise Operatoren sind konzeptionell und optisch mit logischen Operatoren verwandt, was wahrscheinlich erklärt, warum sie in der Ranglistentabelle nahe beieinander liegen. Vielleicht könnte man sogar argumentieren, dass es verwirrend wäre,
&
höher zu sein als==
,&&
aber niedriger zu sein==
.Sobald ein Präzedenzfall (!) Festgelegt wurde, war es wahrscheinlich aus Gründen der Konsistenz für andere Sprachen besser, diesem zu folgen.
Ich stimme Ihnen jedoch eher zu, dass dies nicht optimal ist. In der Praxis ähneln Bitoperatoren eher mathematischen als logischen Operatoren, und es wäre besser, sie vorrangig mit den mathematischen Operatoren zu gruppieren.
quelle