Question

peut tous si ... then ... autre être converti en une déclaration équivalente en utilisant seulement:

Était-ce utile?

La solution

Alors que toute utilisation, je peux penser pour l'opérateur ternaire peut être mis en œuvre comme if / else, l'inverse est pas vrai; du moins pas sans recourir à des « trucs » pervers et inutiles qui donnent aucun avantage en termes de performance, la lisibilité ou la maintenabilité.

La syntaxe de if / else est:

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

alors que la syntaxe du: opérateur ternaire est:

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

L'important étant ici qu'un <expression> et un <statement> sont différents éléments syntaxiques.

L'utilisation très limitée de la forme:

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

peut être mis en œuvre:

x = b ? y : x ;

mais ici, la restriction est que la même variable est affecté à la fois les clauses vraies et fausses, (et donc y et z sont tous les deux au moins convertible du type de x). Donc, on peut dire que tout cession conditionnelle peut être mis en œuvre avec l'opérateur ternaire (après tout ce qui est son objectif principal).

depuis un appel de fonction est une expression valide, vous pouvez envelopper les clauses vraies et fausses dans des fonctions distinctes, mais de le faire simplement pour prouver un point est un peu pervers:

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

est équivalent à:

b ? true_stuff() : false_stuff() ;

et ces fonctions peuvent contenir tout code du tout.

Donc, pour convertir plus générale if / else cas à: fonctionnement, les blocs de déclaration vrai / faux doivent d'abord être enveloppés dans des fonctions distinctes. Cependant, même alors, Neil les exemples de Butterworth vaincront cette approche puisque le comportement des break, continue et return affectent le flux de contrôle au-delà des limites de la si / else, (bien que peut-être ce sont aussi des exemples de code que vous voulez éviter!). La présence d'un goto dans le if / else serait aussi vaincre cette approche. .

Je pense à la fin, même si vous pouvez, pourquoi voudriez-vous?

Autres conseils

Le code:

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

ne peut pas être converti en:

flag ? exit(1) : return 0;

Un meilleur exemple - ce serait dans une boucle:

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

ne peut pas être converti en:

flag ? continue : break;

Non.

Les deux « branches » de l'expression conditionnelle doit évaluer au même type, et ce type ne doivent pas être void.

Par exemple, vous pouvez faire ceci:

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

parce que printf retour int. (J'utiliser seulement cela dans une ronde de golf de code, mais, en fait, Je viens de faire .)

Mais vous ne pouvez pas faire ceci:

x > 0 ? exit() : 0;

parce que les rendements de exit void (ou, en fait, ne revient pas du tout).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top