Welche Priorität hat der Kommaoperator innerhalb des Bedingungsoperators in C ++?

7

Was passiert hier?

%Vor%

Der zweite Fall scheint in Ordnung zu sein. Ich würde erwarten, dass sowohl x als auch y im ersten Fall auf 1 erhöht werden, aber nur der linke Operand erhöht sich.

    
hhbilly 27.08.2012, 04:15
quelle

3 Antworten

17

Der erste entspricht:

%Vor%

Der zweite entspricht:

%Vor%

Somit wird --y immer ausgeführt. In der ersten Zeile werden die Inkremente zuerst ausgeführt, so dass x = 1, y = 0 erwartet wird. In der zweiten Zeile wird das Dekrement von x zuerst ausgeführt, so dass x = -1, y = -1 erwartet wird.

Wie in einem Kommentar (zu einer anderen Antwort) von Barmar erwähnt:

  

Und falls jemand sich fragt, warum das Komma zwischen ++x und ++y nicht den gleichen Effekt hat, liegt das daran, dass (true? ++x) überhaupt nicht gültig ist. Der Compiler scannt also weiter, bis er : findet, aber darüber hinaus stoppt er, wenn ein Operator mit niedrigerer Priorität [( , in diesem Beispiel) oder das Ende der Anweisung] erreicht wird.

    
Jonathan Leffler 27.08.2012, 04:19
quelle
4

y ist Null, weil Komma die niedrigste Priorität unter allen C ++ Operatoren hat. Da der Vorrang niedriger als der des ternären Bedingungsoperators ist, werden die Bedingungsoperatoren als true? ++x, ++y : --x und false? ++x, ++y : --x analysiert. In beiden Fällen wird die --y -Anweisung bedingungslos ausgeführt.

BEARBEITEN Das erste Komma ist anders, weil der Compiler eine ? gefunden hat, also benötigt es nun : , um den "when true" Ausdruck der Bedingung zu vervollständigen. Deshalb werden sowohl ++x als auch ++y verwendet.

    
dasblinkenlight 27.08.2012 04:21
quelle
0

Lesen Sie den Standard

  

§5.18 Komma operator [expr.comma]

     

¶1 Der Komma-Operator wird von links nach rechts gruppiert.

%Vor%      

Ein durch Komma getrenntes Ausdruckspaar wird von links nach rechts ausgewertet; Der linke Ausdruck ist ein verworfener Wert   Ausdruck (Klausel 5). 83 Jede Wertberechnung und Nebenwirkung in Verbindung mit dem linken Ausdruck   wird vor jeder mit dem richtigen Ausdruck verbundenen Wertberechnung und Nebenwirkung sequenziert. Der Typ   und Wert des Ergebnisses sind die Art und der Wert des rechten Operanden; Das Ergebnis entspricht derselben Wertkategorie   als sein rechter Operand, und ist ein Bit-Feld, wenn sein rechter Operand ein glvalue und ein bit-Feld ist.

     

¶2 In Kontexten, in denen Komma eine besondere Bedeutung hat [Beispiel: in Listen von Argumenten zu Funktionen (5.2.2)   und Listen von Initialisierern (8.5) - Beispiel am Ende des Beispiels. Der Komma-Operator, wie in Abschnitt 5 beschrieben, kann nur erscheinen   in Klammern. [Beispiel:

%Vor%      

hat drei Argumente, von denen das zweite den Wert 5. -end Beispiel]

hat
    
Adrian Cornish 27.08.2012 04:21
quelle

Tags und Links

yii\base\ErrorException
Copied! Copy Stacktrace Search Stackoverflow Search Google Error

PHP Core Warningyii\base\ErrorException

PHP Startup: Unable to load dynamic library 'mongodb.so' (tried: /usr/lib64/php/modules/mongodb.so (/usr/lib64/php/modules/mongodb.so: cannot open shared object file: No such file or directory), /usr/lib64/php/modules/mongodb.so.so (/usr/lib64/php/modules/mongodb.so.so: cannot open shared object file: No such file or directory))

$_GET = [
    'id' => '417397',
    'url' => 'whats-the-precedence-of-comma-operator-inside-conditional-operator-in-c',
];

$_COOKIE = [
    '_csrf-frontend' => '3c05efe84fc13a86f0f659a3c793fa39b7b1193d0c9e928294a6f7e8f429e4b6a:2:{i:0;s:14:"_csrf-frontend";i:1;s:32:"GKWM6_j4K5vl93pgcKHAydxGL_qVBxaU";}',
    'advanced-frontend' => 'c165bad7b67b1c35c2c1ec6489f5523e',
];

$_SESSION = [
    '__flash' => [],
];