Rangfolge und Reihenfolge der Auswertung
Die Rangfolge und Assoziativität von C-Operatoren beeinflussen das Gruppieren und die Auswertung von Operanden in Ausdrücken.Eine Operatorrangfolge ist nur sinnvoll, wenn andere Operatoren mit einer höheren oder niedrigerer Rangfolge vorhanden sind.Ausdrücke mit HochRangfolge Operatoren werden zuerst ausgewertet.Rangfolge kann durch das Wort bindende auch beschriebenen „.“ Operatoren mit einer höheren Priorität werden festere gesagt, um eine Bindung zu haben.
In der folgenden Tabelle wird die Rangfolge und Assoziativität (die Reihenfolge, in der die Operanden ausgewertet werden zusammen C-Operatoren) aus und übergibt diese in der Reihenfolge der Rangfolge von oben nach unten an.Wenn mehrere Operatoren zusammengefasst werden, haben sie werden gemäß ihrem gleichen Rang und Assoziativität ausgewertet.Die Operatoren in der Tabelle werden in den Abschnitten beschrieben, die mit Postfix-Operatorenstarten.Der Rest dieses Abschnitts gibt allgemeine Informationen über die Rangfolge und Assoziativität.
Rangfolge und Assoziativität von C-Operatoren
Symbol1 |
Vorgangstyp |
Assoziativität |
---|---|---|
[ ] ( ) . – >-Postfix++ und Postfix -- |
Ausdruck |
Von links nach rechts |
Präfix ++ und Präfix -- sizeof & *,+! ~ |
Unär |
Von rechts nach links |
typecasts |
Unär |
Von rechts nach links |
* / % |
Multiplikativ |
Von links nach rechts |
+ – |
Additiv |
Von links nach rechts |
<< >> |
Bitweise Verschiebung |
Von links nach rechts |
< > <= >= |
Relational |
Von links nach rechts |
== != |
Gleichheit |
Von links nach rechts |
& |
Bitweises AND |
Von links nach rechts |
^ |
Bitweis-Exklusiv-ODER |
Von links nach rechts |
| |
Bitweis-inklusiv-ODER |
Von links nach rechts |
&& |
Logisches AND |
Von links nach rechts |
|| |
Logisches OR |
Von links nach rechts |
?: |
Bedingter Ausdruck |
Von rechts nach links |
= *= /= %= += <<= – = >>=&= ^= |= |
Einfaches und Verbund-assignment2 |
Von rechts nach links |
, |
Sequenzielle Auswertung |
Von links nach rechts |
1.Operatoren werden in absteigender Reihenfolge von der Rangfolge aufgeführt.Wenn mehrere Operatoren in der gleichen Zeile oder in einer Gruppe angezeigt werden, haben sie denselben Rang.
2.Alle einfachen und Zuweisungsoperatoren haben denselben Rang.
Ein Ausdruck kann mehrere Operatoren mit gleichem Rang enthalten.Wenn mehrere solcher Operatoren auf der gleichen Ebene in einem Ausdruck vorkommen, wird die Auswertung entsprechend dem Assoziativität des Operators, entweder von rechts nach links oder von links nach rechts fortgesetzt.Die Reihenfolge der Auswertung hat keine Auswirkung auf die Ergebnisse von Ausdrücken, die mehr als eine Multiplikation (*(Addition)+) oder BINARY-bitweisen (Operator)**& | ^**auf derselben Ebene einschließen.Operationsreihenfolge wird von der Sprache nicht definiert.Der Compiler ist, in beliebiger Reihenfolge solche Ausdrücke auswerten, wenn der Compiler einen einheitlichen Ergebnis garantieren kann.
Nur die Auswertung Sequenziell (,), (&&logisches AND, OR) (||), bedingter Ausdruck (? Funktionsaufruf:) und Operatoren stellen Sequenzpunkte und daher sicherstellen einer bestimmten Auswertungsreihenfolge für ihre Operanden.Im Funktionsaufrufoperator ist der Satz von Klammern, die den Funktionsbezeichner folgen.Der Sequenziell Auswertung Operator (und) wird sichergestellt, dass seine Operanden von links nach rechts ausgewertet.(Beachten Sie, dass der Operator Komma in einem Funktionsaufruf nicht derselbe wie der Operator ist und keine Auswertung Sequenziell irgend diese Garantie dafür bereitstellt). Weitere Informationen finden Sie unter Sequenzpunkte.
Logische Operatoren ihre Operanden auch gewährleistet die Auswertung von links nach rechts.Allerdings werten Sie die kleinste Anzahl der Operanden aus, die erforderlich sind, um das Ergebnis des Ausdrucks bestimmt.Dies wird als „short“ Auswertung bezeichnet.Somit werden einige Operanden des Ausdrucks nicht ausgewertet werden.Beispielsweise wird im Ausdruck
x && y++
Der zweite Operand, y++, wird nur ausgewertet, wenn x zutrifft (Wert ungleich 0 (null).Folglich wird y nicht inkrementiert, wenn x false ist (0).
Beispiele
Die folgende Liste zeigt, wie der Compiler automatisch mehrere Ausdrücke Beispiel bindet:
Ausdruck |
Die automatische Bindung |
---|---|
a & b || c |
(a & b) || c |
a = b || c |
a = (b || c) |
q && r || s-- |
(q && r) || s–– |
Im ersten Ausdruck hat der bitweise Operator AND (&) Vorrang vor der logischen OR-Operator (||), sodass a & b bildet den ersten Operanden der logischen OR-Operation.
Im zweiten Ausdruck ist der logische Operator OR (||) Vorrang vor der Zuweisung SIMPLE Operator (=) gruppiert werden, sodass b || c Als rechter Operand in der Zuweisung.Beachten Sie, dass der Wert, der a zugewiesene entweder 0 oder 1 ist.
Der dritte Ausdruck zeigt einen ordnungsgemäß gebildeten Ausdruck an, der möglicherweise ein unerwartetes Ergebnis bereitstellt.Der logische Operator AND (&&) hat Vorrang vor der logischen OR-Operator (||), sodass q && r gruppiert wird als Operand.Da die logischen Operatoren Auswertung von Operanden von links nach rechts vor q && r wird sichergestellt, s––ausgewertet.Wenn jedoch q && r auf einen Wert ungleich 0 (null) ergibt, wird s–– nicht ausgewertet, und s wird nicht verringert.Wenn keine Verringerung des von s im Programm ein Problem verursachen, sollte s–– als der erste Operand des Ausdrucks angezeigt werden, oder s muss in einem separaten Vorgang verringert werden.
Der folgende Ausdruck ist ungültig und stellt eine Fehlerdiagnose Meldung zur Kompilierzeit vor:
Ungültiger Ausdruck |
Gruppe Standard |
---|---|
p == 0 ? p += 1: p += 2 |
( p == 0 ? p += 1 : p ) += 2 |
In diesem Ausdruck ist der Gleichheitsoperator (==) zum höchsten Rang, sodass p == 0 gruppiert wird als Operand.Der Operator des bedingten Ausdrucks (? :) NEXT-höchsten hat Vorrang.Sein der erste Operand ist p == 0, deren zweiter Operand ist p += 1.Allerdings wird der letzte Operand des Operators des bedingten Ausdrucks als pp += 2sondern betrachtet, da dies Vorkommen von p genauer an den Operator des bedingten Ausdrucks bindet, als es in den Zuweisungsoperator verfügt.Ein Syntaxfehler tritt auf, weil += 2 keinen linken Operanden besitzt.Möglicherweise möchten Sie Klammern verwenden, um Fehler dieser Art zu vermeiden und den Code verständlicher zu erzeugen.Beispielsweise können Sie Klammern verwenden wie weiter unten, um das vorherige Beispiel zu beheben und zu berücksichtigen:
( p == 0 ) ? ( p += 1 ) : ( p += 2 )