質問
することができ、すべての場合...そして... else文のみ使用する同等の文に変換する:?
解決
は、逆は真ではありません。ないひねくれや性能、読みやすさ、または保守性の面で何のメリットが得られない無意味な「トリック」に頼ることなく、少なくともます。
もし/他の構文は次のとおりです。
if( <boolean expression> )
<statment>|<statment block>
else
<statment>|<statment block>
の構文に対し:?三項演算子があります:
<boolean expression> ? <expression> : <expression> ;
ここで重要な<expression>
と<statement>
が異なる構文要素であることをされています。
フォームの非常に限られた用法ます:
if( b ) x = y else x = z ;
はとして実装することができます
x = b ? y : x ;
が、ここでの制約は、同じ変数が、真と偽の句の両方に割り当てられている(したがって、yおよびzが両方のXの種類に少なくとも変換可能である)ということです。それは言うことができるように、任意のの条件付き割り当ての三項演算子を用いて実施することができる(その主な目的であるすべての後)。
関数呼び出しが有効な式ですので、今、あなたは別々の機能で真と偽の句をラップすることができますが、ポイントを証明するために、単純にそれを行うためには、多少ひねくれあります:
if( b )
true_stuff() ;
else
false_stuff() ;
に相当します:
b ? true_stuff() : false_stuff() ;
と、これらの機能はすべてで任意のコードを含めることができます。
より一般的な場合/他のケースを変換するために、だから、:?操作、真/偽ステートメントブロックが最初に別々の機能でラップする必要があります。 (おそらくそれらはまた、あなたが避けたいコードの例ですが!)break
、continue
、およびreturn
の行動が、もし/ else構文の境界を越え制御フローに影響を与えるしかしその後もニールバターワースの例は、このアプローチを打ち負かすだろう。他にも、これを台無しにしてしまう場合/アプローチでgoto
の存在。ます。
私はあなたが、なぜあなたは?
にしたいと思うことができたとしても、最終的に考えます他のヒント
コード
if ( flag ) {
exit(1);
}
else {
return 0;
}
は変換することができません
flag ? exit(1) : return 0;
の良好例の - これはループ内であろう:
if ( flag ) {
continue;
}
else {
break;
}
はに変換することはできません
flag ? continue : break;
はありません。
条件式の両方とも「枝」は、同じタイプに評価される必要があり、その種類はvoid
であってはなりません。
たとえば、あなたがこれを行うことができます:
x > 0 ? printf("Positive!\n") : 0;
printf
リターンint
ので。 (私は、コードゴルフのラウンドでこれを使用するであろうけれども、実際には、私はちょうどをやった。)
あなたがこれを行うことはできません。しかします:
x > 0 ? exit() : 0;
exit
を返しますvoid
(または、実際には、すべてでは戻りません)のでます。