連続した条件演算子の解釈
- 三項演算子は上から評価される (R.Tanaka.Ichiro's Blog)
一瞬、何の話だか判りませんでした。条件演算子なんて普段滅多に使わないので。。。
考え方としては「上から評価される」で間違っていないけど、単に「上から評価」と言ってしまうと誤解を招く恐れがある気がしたので勝手に補足。
(元のプログラムをちょっと改変して掲載)
var hoge = 6; Console.WriteLine( hoge % 2 == 0 ? "2の倍数" : hoge % 3 == 0 ? "3の倍数" : hoge % 4 == 0 ? "4の倍数" : hoge % 5 == 0 ? "5の倍数" : hoge % 6 == 0 ? "6の倍数" : "6以下の倍数ではない" ); // 「2の倍数」と出力される
と云うのは、↓の様に解釈される(はず)。
var hoge = 6; Console.WriteLine( (hoge % 2 == 0)?("2の倍数"):( (hoge % 3 == 0)?("3の倍数"):( (hoge % 4 == 0)?("4の倍数"):( (hoge % 5 == 0)?("5の倍数"):( (hoge % 6 == 0)?("6の倍数"):("6以下の倍数ではない") ) ) ) ) );
更に言うと、イメージ的には↓と一緒。
var hoge = 6; if (hoge % 2 == 0) { Console.WriteLine("2の倍数"); } else { if (hoge % 3 == 0) { Console.WriteLine("3の倍数"); } else { if (hoge % 4 == 0) { Console.WriteLine("4の倍数"); } else { if (hoge % 5 == 0) { Console.WriteLine("5の倍数"); } else { if (hoge % 6 == 0) { Console.WriteLine("6の倍数"); } else { Console.WriteLine("6以下の倍数ではない"); } } } } }
つまり、 2 個目以降の条件句は、一つ前の else ブロック内での評価になるので、手前で合致すれば当然それ以降の条件は評価されない、と。