Warum würden Sie den ternären operator ohne Zuweisung einen Wert für die "wahren" Bedingung (x = x ?: 1)
In der Android-open-source-qemu-code, den ich lief über diese code-Zeile:
machine->max_cpus = machine->max_cpus ?: 1; /* Default to UP */
Ist das nur eine verwirrende Art zu sagen:
if (machine->max_cpus) {
; //do nothing
} else {
machine->max_cpus = 1;
}
Wenn dem so ist, wäre es nicht klarer, als:
if (machine->max_cpus == 0) machine->max_cpus = 1;
Interessant, diese kompiliert und funktioniert mit gcc, aber nicht kompilieren auf http://www.comeaucomputing.com/tryitout/ .
- Warte, was?! ... das sieht nach einem bug für mich.
- wahrscheinlich nicht. Der Kommentar schlägt vor, die Linie stellt eine Standard - wenn "max_cpus nicht festgelegt ist, legen Sie den Standard-Wert".
- Wenn es legal ist, würde ich es vermeiden, denn es sieht zu sehr aus wie könnte es ein bug sein. Hier führen wir eine große Diskussion darüber, was beweist, dass es wäre übersichtlicher gewesen, um die Verwendung der if-Anweisung.
- In diesem Fall würde ich erwarten, dass ein commend à la "GNU-Erweiterung) syntax: ...". Aber du hast wahrscheinlich Recht.
- Nee. In einem großen compiler-spezifischen code-Basis, Sie sind kaum noch Los, zu kommentieren, jede einzelne Nutzung eine Erweiterung mit "dies ist eine Erweiterung". Zugegeben, dies ist eine besonders knifflige Sache für den Leser zu finden, indem Sie Google-Suche, im Vergleich mit, sagen wir,
__builtin_clz
oder (in C++)long long
... - "wäre es nicht deutlicher". Ja. Aber vielleicht nicht so viel, wenn er es hätte
machine->max_cpus = arguments->max_cpus ?: 1;
. Könnte sein, das Ergebnis von über-über ein idiom, das funktioniert in einigen Fällen, in anderen aber nicht.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist erlaubt in GNU als eine obskure Erweiterung zu C
Wie Sie wahrscheinlich erraten, dies zu vermeiden, wird empfohlen zur besseren Lesbarkeit und Portabilität Gründen. Ich bin ehrlich gesagt überrascht, zu sehen, wie eine Grammatik-inkompatible Erweiterung zu C.
||
funktionieren soll.max_cpus
ist kein boolean Wert.||
hat keine Möglichkeit, die Bewertung zu3
wenn der Vorherige Wert war3
.ternary conditional
und mehr wie einlogical or
in den meisten Sprachen, die ich propopse es fortan genanntternarator
Dies ist ein GCC-Erweiterung das bedeutet, dass "wenn die Bedingung true ist, verwenden Sie es, sonst Gebrauch dieser anderen Wert", so
ist die Kurzform für
obwohl, wenn die bedingte hat Nebenwirkungen, wird es nur einmal ausgeführt werden
Verwendung von gcc -pedantic-flag, es sagt, dass
Es ist ein GCC-Erweiterung, und es wird mehr interessant und nützlich, wenn die Bedingung hat Nebenwirkungen.
In diesem Fall, ja, ich würde Zustimmen, dass es mehr verdecken als alles andere.
Den K&R BNF zeigt einen Ausdruck ist es erforderlich, zwischen "?" und ":". Ich glaube nicht, dass gcc sollte das kompilieren ohne eine Diagnose.
Es gibt eine andere nützliche Falle für diese-die Beseitigung intermediärer Variablen beim Aufruf einer Funktion oder Methode, die null zurückgeben könnte, die wir vermeiden wollen, ruft zweimal. Zum Beispiel (Objective-C), nehmen wir an, wir wollen zum entpacken einer Datei in ein array, wenn es existiert, ansonsten gibt ein leeres array zurück.
Die alternativen sind weniger prägnant.
Oder hässlicher mit mehreren returns etc.
So ist es nützlich, syntaktische Zucker, das finde ich gut lesbar. Die Nachteile sind
Implizite Konvertierung von einem Zeiger auf ein bool. Dies ist eine langjährige C
Konvention, aber die meisten modernen Sprachen verbieten es, die erschwerenden
jeder der Portierungsaufwand.
Als andere haben gesagt, es ist auch eine nicht-standard-Erweiterung, so sollte es
vermieden werden, wenn die übertragbarkeit eine überlegung an alle.