Frage

kann jeder, wenn ... dann ... else-Anweisung in eine äquivalente Anweisung umgewandelt wird unter Verwendung von nur:

War es hilfreich?

Lösung

Während jede Anwendung ich für den ternären Operator denken kann, als eine if / else umgesetzt wird, ist die Umkehrung nicht wahr; zumindest nicht ohne pervers und sinnlos Zuflucht ‚Tricks‘, die keinen Nutzen in Bezug auf Leistung, Lesbarkeit ergeben, oder Wartbarkeit.

Die Syntax if / else ist:

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

, während der Syntax der: ternärer Operator ist:

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

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

Die sehr begrenzte Nutzung der Form:

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

als implementiert werden:

x = b ? y : x ;

aber hier die Beschränkung ist, dass die gleiche Variable wird sowohl in den wahren und falschen Klauseln zugeordnet ist, (und daher y und z beide mindestens umwandelbar die Art von X). So kann man sagen, dass jede bedingte Zuweisung kann mit dem ternären Operator (nach allem, was der Hauptzweck ist) umgesetzt werden.

Da nun ein Funktionsaufruf ein gültiger Ausdruck ist, können Sie die wahren und falschen Klauseln in getrennten Funktionen wickeln, aber das einfach zu tun, einen Punkt zu beweisen, ist etwas pervers:

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

entspricht:

b ? true_stuff() : false_stuff() ;

und diese Funktionen können einen beliebigen Code überhaupt enthalten.

So die allgemeinere if / else Fall zu einem konvertieren: Operation, die wahr / falsch Anweisungsblöcke müssen zunächst in getrennten Funktionen gewickelt werden. Doch selbst dann Beispiele Neil Butterworth werden da das Verhalten von break, diesen Ansatz besiegen continue und return beeinflussen Kontrollfluss über die Grenzen des if / else-Konstrukts, (wenn auch vielleicht sind auch solche Beispiele von Code, den Sie wollen vermeiden!). Die Anwesenheit eines goto im if / else auch diesen Ansatz vereiteln würde. .

ich glaube, am Ende, auch wenn Sie könnten, warum sollten Sie wollen?

Andere Tipps

Der Code:

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

kann nicht umgewandelt werden:

flag ? exit(1) : return 0;

Ein besseres Beispiel - dies in einer Schleife würde:

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

kann nicht konvertiert werden:

flag ? continue : break;

Nein.

Die beiden „Zweige“ des Bedingungsausdrucks auf die gleiche Art bewerten muss und dass Typ muss nicht void sein.

Zum Beispiel könnten Sie dies tun:

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

weil printf Rückkehr int. (Ich würde dies nur in einer Runde Code Golf verwenden, obwohl in der Tat, ich gerade tat .)

Aber man kann dies nicht tun:

x > 0 ? exit() : 0;

da exit kehrt void (oder eigentlich nicht zurück überhaupt).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top