2016-08-02 4 views
2

I verwirrt bin durch:Warum mehrere Anweisungen in ternärem Operator nicht ausgeführt

#include <iostream> 

int main() 
{ 
    bool a = true; 
    int nb = 1; 
    int nb2 = 2; 
    a ? nb++, nb2++ : nb--, nb2--; 
    std::cout << " (nb,nb2) = (" << nb << "," << nb2 << ")"; 
} 

Ergebnis:

(nb,nb2) = (2,2) 

Warum ist nb2 nicht gleich 3?

+0

a) keine Komma-Operator, es sei denn verwenden du brauchst es unbedingt (weil * es böse * ist), b) benutze kein ternäres um Seiteneffe zu produzieren cts - Verwenden Sie Ternär, um nur einen bedingten * Wert * zu erhalten. – vaxquis

+0

@NathanOliver: Die interessante Frage ist: Warum kompiliert das ohne Warnungen? –

+0

@NathanOliver Yeah, ich habe die Waffe wirklich übersprungen. Ich habe die enge Abstimmung zurückgenommen, aber es scheint, dass sie den zugehörigen Kommentar nicht entfernt. – Borgleader

Antwort

9

Da der Betreiber Priorität. Ihr Ausdruck wertet als

((a) ? (nb++, nb2++) : nb--), nb2--; 

Operator , (comma) ist das letzte, was zu verarbeiten. Und dieses Beispiel würde überhaupt nicht kompilieren, sondern

Der Ausdruck in der Mitte des bedingten Operators (zwischen? Und :) wird analysiert, als ob in Klammern gesetzt.

Weitere Informationen finden Sie unter C++ Operator Precedence.

4

Verwendung geklam- mert:

a ? (nb++, nb2++) : (nb--, nb2--); 

Grund: lexikalische Analyse

Verwandte Themen