2016-01-01 10 views
8

Ich erkannte vor kurzem, dass Sie den ternären Operator in GCC und Klirren ohne Mitte (?: oder ? : Werke) verwenden können, und es wird der erste Ausdruck in der Mitte ein:Ternary Operator ohne den mittleren Ausdruck

// outputs 2 
cout << (2 ?: 4); 
// outputs 3 
cout << (0 ? : 3); 

Wo ist das im Standard? Ich schaute und sah nichts davon.

+0

Es wird nicht der erste Ausdruck in die Mitte eingefügt. Es verwendet das _result_ des ersten Ausdrucks in der Mitte. Wenn also der erste Ausdruck eine Funktion ist, wird die Funktion nicht zweimal ausgeführt. – ldanilek

Antwort

10

Es ist nicht in der Norm überhaupt.

Was Sie beobachten eine GCC-Erweiterung: https://gcc.gnu.org/onlinedocs/gcc/Conditionals.html

Wenn Sie weglassen, sein Wert aus dem ersten Operanden genommen wird vor der kontextuellen Umstellung auf bool.
Der Wert der Erweiterungen liegt darin, dass sich die Nebenwirkungen nicht wiederholen und die Größe der Quellcodes reduziert wird.

+1

Das ist, was ich dachte, danke. Sinn macht auch seine Gegenwart in Clang. – Czipperz

+1

Ist es eine gute Idee, C++ - Code zu haben, der nur mit GCC/Clang funktioniert? – Ilya

+0

@Ilya Es ist eine gute Idee, so sauberen und tragbaren Code zu schreiben, wie es vernünftigerweise möglich ist, ohne dass zu viel Aufwand betrieben oder die Leistung inakzeptabel beeinträchtigt wird. Kurz gesagt, fast nie. – Deduplicator