Fast alle C / C ++ Operatoren-Rangordnungstabellen, die ich konsultiert habe, führen auf, dass der ternäre Bedingungsoperator eine höhere Priorität hat als die Zuweisungsoperatoren. Es gibt jedoch ein paar Tabellen, wie die auf wikipedia , und die eine bei operator-precedence.com , die sie auf die gleiche Rangstufe setzen. Was ist es, höher oder gleich?
Die Antwort für C ++ ist, dass ?:
und =
die gleiche Priorität haben. Ja, fast jede C ++ Operator-Präzedenz-Tabelle ist falsch.
In C spielt es keine Rolle, ob ?:
höher als =
ist oder nicht, weil in C der Operator ?:
nicht auf einen l-Wert ausgewertet werden darf, was er tun müsste wenn die Vorrangstellung das Verhalten beeinflussen sollte (vorausgesetzt, dass sie bereits RTL assoziativ sind). Siehe die Diskussion unter Luchian Crigores Antwort zum Beispiel.
Vielleicht ist dieser Fehler so weit verbreitet, weil frühe C ++ Operator-Vorrang-Tabellen möglicherweise aus C-Tabellen kopiert und erweitert wurden. Und vielleicht hat der Fehler bestanden, weil das einzige Gegenbeispiel - Ausdrücke der Form a?b:c=d
- selten verwendet werden. Vielleicht.
In der C ++ - Grammatik
%Vor%könnte zu
kombiniert werden %Vor% Betrachtet man nur =
und ?:
, und ignoriert man den inneren Ausdruck zwischen ?
und :
, gibt dies ?:
und =
eindeutig den gleichen Vorrang.
Dies unterscheidet sich von der C-Grammatik, in der weder der linke noch der rechte Operand von ?:
einen Zuweisungsoperator als obersten Operator haben kann.
Also ist es für C sinnvoll, ihnen verschiedene Vorrangstufen zu geben.
Das heißt, Rangstufen sind nur eine Annäherung an das, was der Standard tatsächlich sagt. Es gibt Fälle für alle Rangstufen, die Sie wählen, die die Stufen als irreführend oder einfach falsch anzeigen. Abhängig von Ihrer Interpretation kann der innere Ausdruck von ?:
einer von ihnen sein, das ist für mich.
Das finden Sie im Standard:
58) Der Vorrang von Operatoren wird nicht direkt angegeben, kann aber aus der Syntax abgeleitet werden. (Notiz)
Dies bedeutet, dass Vorrangtabellen abgeleitet, nicht spezifiziert werden. Solange sie sich gleich verhalten, können Sie sagen, dass beide richtig sind. Selbst wenn eine Prioritätstabelle sie mit der gleichen Priorität belegt oder das Ternär über den Zuweisungsoperator stellt, passiert in der Praxis das Gleiche aufgrund der Syntax.
Beachten Sie, dass Assoziativität hier eine größere Rolle spielt (dies ist auch von der Syntax abgeleitet).
Auch wenn Sie davon ausgehen, dass sie die gleiche Priorität haben:
%Vor% wird als a = (b ? c : d)
behandelt, weil sie beide von rechts nach links assoziativ sind.
Tags und Links c c++ ternary-operator operator-precedence