Hat der ternäre C / C ++ - Operator tatsächlich den gleichen Vorrang wie Zuweisungsoperatoren?

7

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?

    
Museful 22.11.2012, 15:04
quelle

3 Antworten

6

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.

    
Museful 22.11.2012, 21:05
quelle
12

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.

%Vor%

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.

    
hvd 22.11.2012 15:08
quelle
7

Das finden Sie im Standard:

5 Ausdrücke [expr]

  

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.

    
Luchian Grigore 22.11.2012 15:09
quelle