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

雑記 - otherwise

最近はDQ10しかやっていないダメ技術者がちまちまと綴る雑記帳

連続した条件演算子の解釈

C#

一瞬、何の話だか判りませんでした。条件演算子なんて普段滅多に使わないので。。。
考え方としては「上から評価される」で間違っていないけど、単に「上から評価」と言ってしまうと誤解を招く恐れがある気がしたので勝手に補足。
(元のプログラムをちょっと改変して掲載)

  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 ブロック内での評価になるので、手前で合致すれば当然それ以降の条件は評価されない、と。