読者です 読者をやめる 読者になる 読者になる

条件演算子・・・厨?

名前 症状 僕の状態
三項演算子 どんどんネストした三項演算子を書いてしまう.気が付くと自分でも良くわからなくなってる事もある 治療済み
プログラマの麻疹 - YoshioriのBlog

三項演算子は多分条件演算子のことだろう、ってのはいいとして、ネストした条件演算子は書き方が悪いだけです!と言ってみる。


三項演算子?:の正しい書き方


で、ここのブクマコメに、id:nekora 「うーむ。一理あるような気がするけど、私ならifにする。」とか、id:PoohKid 「if文を1行で表記したいから三項演算子にするんだよね…」とか、id:sqrt 「改行したくなるほど複雑な表現になったら?:を諦めてif文などに置き換えるのがベストプラクティスだって偉い人がゆってた。だから、三項演算子は1行で書くのが正しい書き方。」とかあるんだけど・・・違うよ!全然違うよ!


if 文を条件演算子で置き換えることは出来るけど、その逆は常に可能であるわけではないんだよ。
トラックバックで指摘があったように、if 文も常に条件演算子で置き換えることはできないですね。
例えば、a と b の大きい方で c を初期化するコードを条件演算子で書くと、

// この程度なら1行で書く・・・けどそこは本題じゃない
int c = a > b ? a : b;

となるけど、if 文で書ける?

if (a > b) {
    int c = a;
    // 1
} else {
    int c = b;
    // 2
}

書けないよね。もしやるなら c を初期化した後のコードを関数にまとめて、コメントの 1 と 2 のところで呼び出すとか?
よろしい、ならここは if 文でも書けるということにしておいてあげる。


でも、「式」しか書けない所ではそうはいかない。
例えば、(C++ で) 初期化リストの中や TMP では if 文なんて使えないので条件演算子を使わなければならない。

// ちと作為的な例だけど
class hoge
{
    const piyo& ref_p;
public:
    hoge(int a, int b, const piyo& p1, const piyo& p2)
        : ref_p(a < b ? p1 : p2)
    {}
};

これは if 文では絶対に書けない。


おまけ:
C++ では、条件演算子を含む式を左辺に持ってくることも可能なのは覚えておいても損はない。
でも使うなよ?絶対使うなよ?

(a < b ? a : b) = c;