プログラミング言語 C

三項演算子では 式1 ? 式2 : 式3 のうち 式1 が最初に評価される。

・ もしそれが 0 ではない - 真 - なら 式2 が評価されて この条件式の値となる。0 であれば 式3 が評価されて その値となる。

・ (つまり) 評価されるのは 式2 と 式3 のどちらか一方のみである。

・ 例えば a と b どちらか大きなほうの値を z にセットするには、

z = (a > b) ? a : b;

という式になる。

・ もし 式2 と 式3 とが異なる型であれば、結果の値の型は (他の条件式と同様) 「型の変換規則」にしたがって 決定される。

・ f が float型で n が int型の場合、式

(n > 0) ? f : n;

では n は その正負にかかわりなく float型に変換される。

・ 上の 式1 は (実際には) カッコを必要としない。しかし (プログラムを記述する際は) 付けたほうが わかりやすくなる。

三項演算子によって より簡潔なプログラムを書くことができる。

・ 例えば、次のループ文では 配列の n個の要素を 1行に 10個ずつ 空白で区切って並べ、各行は (最後の行を含めて) 改行文字で終了して プリントする。

for (i = 0; i < n; i++) {
printf("%6d%c", a[i], (i%10 == 9 || i == n - 1) ? '\n' : ' ');
}

・ 適切な例をもう一つ。(複数個のときは item の後ろに 's' が付き、単数のときには付かない↓)

printf("You have %d item%s\n", n, n == 1 ? "" : "s");

[演習] 大文字を小文字に変換する関数 lower を if/else文と 三項演算子とで それぞれ作成せよ。(p63-64)


最初は if/else文、

  1. /* lower.c */
  2. #include
  3. int lower(int);
  4. main()
  5. {
  6. int c;
  7. char a = 'A';
  8. c = a;
  9. printf("%c\n", lower(c));
  10. return 0;
  11. }
  12. int lower(int c)
  13. {
  14. if (c >= 'A' && c <= 'Z')
  15. return c + 'a' - 'A';
  16. else
  17. return c;
  18. }

次は 三項演算子

  1. /* lower_a.c */
  2. #include
  3. int lower(int);
  4. main()
  5. {
  6. int c;
  7. char a = 'A';
  8. c = a;
  9. printf("%c\n", lower(c));
  10. return 0;
  11. }
  12. int lower(int c)
  13. {
  14. c = (c >= 'A' && c <= 'Z') ? c = 'a' - 'A' : c;
  15. }

(追記) コードのまちがいを こっそり訂正。

(さらに追記) 「ブランク」というのが なんかおかしいので「空白」に変えてみる。