c ++ ternärer Operator

8

Ich bin also auf etwas Interessantes gestoßen, das ich über den ternären Operator nicht erkannt habe (zumindest in Visual C ++ 98-2010). Wie in Ссылка angegeben, wenn sowohl der Ausdruck als auch der Bedingungsausdruck l sind -Wert das Ergebnis ist ein L-Wert.

Natürlich schreibt man normalerweise in c / c ++ so etwas wie:

int value = (x == 1) ? 1 : 0;

und kümmern sich nicht einmal um den r-Wert / l-Wert involvment, und in diesem Fall sind weder 1 noch 0 in l-Werte umwandelbar.

Nehmen Sie jedoch etwas wie:

int value = (x == 1) ? y : z;

Sowohl y als auch z sind l-Werte und sie, oder genauer gesagt, einer von ihnen ist das tatsächliche Ergebnis des ternären Operators (nicht sein gespeicherter Wert), was nicht unbedingt offensichtlich ist (zumindest hatte ich nie darüber nachgedacht) in jeder Länge).

Aber was dazu führt, ist die Fähigkeit, Folgendes zu schreiben:

(x == 1 ? y : z) = 99;

Dies ordnet 99 zu y zu, wenn x == 1 oder 99 zu z wenn x! = 1

Ich habe das nirgendwo und in allen Diskussionen, die ich gelesen habe, über die Verwendung (oder normalerweise, ob man den ternären Operator benutzt) nie gesehen.

Natürlich funktioniert es nur, wenn sowohl der Ausdruck als auch der Bedingungsausdruck l-Werte wie

sind

(x == 1 ? 0 : z) = 99;

kann nicht kompiliert werden, weil 0 ein r-Wert ist, auf den der Compiler gerne hinweist.

Und das funktioniert nur, wenn Sie die Klammer einfügen

x == 1 ? y : z = 99;

ist etwas ganz anderes, das 99 nur dann zu z zuweist, wenn (x! = 1) und der schöne Teil ist, dass beide Seiten noch l-Werte sind, also gibt es das ernsthafte Rattenloch von Dingen wie (x == 1 ? y : z = 99) = 100 ( es ordnet 100 y oder z zu, abhängig von der Wahrheit von x == 1, stampfen auf die z = 99 Zuweisung, wenn x == 1 ist falsch)

Das führt mich zu meinen Fragen:

A) Ist das Teil des eigentlichen C ++ - Standards (der so aussieht, als wäre es) und nicht nur ein Microsoft-Ding - ich habe geschaut, aber bisher gescheitert, diese Info zu finden.

B) Wenn das weit verbreitet ist und ich unter einem Stein gelebt habe? Ich habe nie gesehen, dass es in irgendeinem Code verwendet wurde, an den ich mich erinnern kann, und habe es nie erwähnt, wenn der ternäre Operator besprochen wird.

C) Muss ich öfter aussteigen?

    
Ruddy 15.07.2010, 16:00
quelle

3 Antworten

10

A) Ja, das ist Teil des Standards.

B) Es ist nicht weit verbreitet, obwohl es hier auf SO sein könnte. Es gibt einen Grund, warum es zum versteckten Feature von C ++ gewählt wurde: Hidden Features von C ++? .

C) Kein Kommentar. :)

Ich persönlich empfehle, diese Funktion zu deaktivieren. Es ist viel weniger intuitiv als die Verwendung von if / else -Anweisungen, und eindeutig nicht jeder weiß darüber.

Entgegen meiner eigenen Warnung versuchte ich es tatsächlich einmal mit einem persönlichen Projekt, und ich wurde verbrannt, indem ich die Klammern verpasste und 30 Minuten lang versuchte, den Fehler zu finden.

    
Justin Ardini 15.07.2010, 16:04
quelle
3

A Ja. § [expr.cond] / 4:

  

Wenn der zweite und dritte Operand lvalues ​​sind und denselben Typ haben, ist das Ergebnis von diesem Typ und ist ein lvalue ...

(Beachten Sie, dass nicht in C wahr ist. Explizit im C99-Standard, Fußnote 93, geschrieben. "Ein bedingter Ausdruck liefert keinen Lvalue.")

B Ich glaube nicht, dass es weit verbreitet ist, da die Verwendung ziemlich unklar ist. Es ist häufiger,

zu sehen %Vor%     
kennytm 15.07.2010 16:06
quelle
2

Sie haben es noch nie benutzt, weil diese Verwendung weniger intuitiv und leserlich ist als die gebräuchlichste. Ich habe noch nie gesehen, dass es im Produktionscode so verwendet wurde, und ich hoffe, ich sehe es nie.

Merken Sie sich Herb Sutter & amp; Andrei Alexandrescus C ++ Coding Standards , Regel 6: "Korrektheit, Einfachheit und Klarheit stehen an erster Stelle."

    
Daniel Daranas 15.07.2010 16:04
quelle