4 Stimmen

Bedingter Operator in C

Kann jede if...then...else-Anweisung in eine äquivalente Anweisung umgewandelt werden, die nur ? verwendet:

7voto

Der Code:

if ( flag ) {
   exit(1);
}
else {
   return 0;
}

nicht umgewandelt werden kann:

flag ? exit(1) : return 0;

Ein besseres Beispiel - dies würde innerhalb einer Schleife geschehen:

if ( flag ) {
   continue;
}
else {
   break;
}

kann nicht umgewandelt werden:

flag ? continue : break;

3voto

Clifford Punkte 82130

Während jede denkbare Verwendung des ternären Operators als if/else implementiert werden kann, ist das Gegenteil nicht der Fall; zumindest nicht, ohne auf perverse und sinnlose "Tricks" zurückzugreifen, die keine Vorteile in Bezug auf Leistung, Lesbarkeit oder Wartbarkeit bringen.

Die Syntax von if/else lautet:

if( <boolean expression> )
    <statment>|<statment block>
else
    <statment>|<statment block>

während die Syntax des ternären Operators ?: lautet:

<boolean expression> ? <expression> : <expression> ;

Wichtig ist dabei, dass ein <expression> und eine <statement> sind unterschiedliche syntaktische Elemente.

Die sehr begrenzte Verwendung des Formulars:

if( b ) x = y else x = z ;

kann als implementiert werden:

x = b ? y : x ;

aber hier besteht die Einschränkung darin, dass dieselbe Variable sowohl in den wahr- als auch in den falsch-Klauseln zugewiesen wird (und daher y und z beide mindestens in den Typ von x konvertierbar sind). Es kann also gesagt werden, dass jede bedingte Zuweisung kann mit dem ternären Operator implementiert werden (schließlich ist das sein Hauptzweck).

Da ein Funktionsaufruf ein gültiger Ausdruck ist, könnten Sie die wahr- und falsch-Klauseln in separate Funktionen verpacken, aber das zu tun, nur um ein Argument zu beweisen, ist etwas pervers:

if( b )
    true_stuff() ;
else
    false_stuff() ;

ist gleichbedeutend mit:

b ? true_stuff() : false_stuff() ;

und diese Funktionen können jeden beliebigen Code enthalten.

Um den allgemeineren if/else-Fall in eine ?:-Operation umzuwandeln, müssen die true/false-Anweisungsblöcke zunächst in separate Funktionen verpackt werden. Aber selbst dann werden die Beispiele von Neil Butterworth diesen Ansatz zunichte machen, da das Verhalten von break , continue y return den Kontrollfluss über die Grenzen des if/else-Konstrukts hinaus beeinflussen (obwohl dies vielleicht auch Beispiele für Code sind, den Sie vermeiden wollen!). Das Vorhandensein einer goto in der if/else-Anweisung würde diesen Ansatz ebenfalls zunichte machen. .

Ich denke, selbst wenn man es könnte, warum sollte man es wollen?

1voto

Thomas Punkte 160390

Nein.

Beide "Zweige" des bedingten Ausdrucks müssen zu demselben Typ ausgewertet werden, und dieser Typ darf nicht void .

Sie könnten zum Beispiel so vorgehen:

x > 0 ? printf("Positive!\n") : 0;

denn printf return int . (Ich würde dies allerdings nur bei einer Runde Code-Golf verwenden, Ich habe gerade .)

Aber das können Sie nicht tun:

x > 0 ? exit() : 0;

denn exit gibt zurück. void (oder eigentlich gar nicht zurückkehrt).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X