Dies ist eine GCC Erweiterung mit dem Namen:
Conditionals with Omitted Operands.
Es ist nicht Standard c. Using -pedantic
Flag für die Kompilierung wird Ihnen sagen, so.
Der mittlere Operand in einem Bedingungsausdruck kann weggelassen werden. Wenn der erste Operand ungleich Null ist, ist sein Wert der Wert des bedingten Ausdrucks.
Daher der Ausdruck
x ? : y
hat den Wert von x, wenn diese ungleich Null ist; ansonsten der Wert von y.
Dieses Beispiel vollkommen äquivalent zu
x ? x : y
In diesem einfachen Fall die Möglichkeit, den mittleren Operanden wegzulassen ist nicht besonders nützlich. Wann es nützlich wird, ist, wenn der erste Operand dies tut, oder kann (wenn es ein Makro-Argument ist) einen Nebeneffekt enthalten. Dann würde das Wiederholen des Operanden in der Mitte den Nebeneffekt zweimal ausführen. Das Auslassen des mittleren Operanden verwendet den Wert, der bereits berechnet wurde, ohne die unerwünschten Auswirkungen der Neuberechnung.
Ist das etwas, was ich auf, in einem gewissen Standard definiert verlassen sollte? Oder nur eine (böse) gcc-Erweiterung, die ich vermeiden sollte?
Abhängig von Ihren Anforderungen entspricht, Wenn Ihr Code auf einem anderen Compiler Implementierung andere als GCC laufen does'nt benötigen, dann können Sie es verwenden.Wenn Ihr Code jedoch auf anderen Compilerimplementierungen aufbauen soll, sollten Sie ihn nicht verwenden.
Irgendwie sollte man so viel intuitiven und lesbaren Code wie möglich schreiben, da ich immer vorschlagen würde, solche (hässliche) Konstrukte zu vermeiden.
Es ist eine böse gcc-Erweiterung, die Sie vermeiden sollten. – Lundin
Ich weiß nicht, warum alle diese Erweiterung hassen. Es ist sehr prägnant und oft besser repräsentiert was ich meine. Ich wünschte, es würde dem Standard hinzugefügt werden. Wie dem auch sei, sollten Sie es nicht verwenden, wenn Sie Kompatibilität mit anderen Compilern als gcc und clang wünschen. –