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.

InformationsquelleAutor RickNotFred | 2010-05-10
Schreibe einen Kommentar