2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

switch文と三項演算子

Last updated at Posted at 2020-04-27

何かと評判の良くない三項演算子の可能性についてちょっと試してみたのでメモ。
まずは典型的な三項演算子。

int age = 18;
Console.WriteLine(age < 20 ? "未成年です" : "成人です");

Console.WriteLine行のかっこ内が三項演算子で、ageが20歳未満であれば未成年ですが表示され、20歳以上であれば成人ですが表示されます。
このように三項演算子は最初の式を評価してtrueであれば:の前の値が引き渡され、falseであれば後の値が引き渡されます。

マルかバツかのような、わざわざif文を書くほどでもないような簡単な処理に重宝します。

では、選択肢が2つ以上ある場合どうなるでしょうか。
普通はif文をたくさん書くか、switch文を書くことになります。
このようなテーブルデータを例に取ると。

id item
0 りんご
1 みかん
2 バナナ

こんな感じのswitch文を書くことができます。

int fruitId = 0
switch (fruitId)
{
	case 0:
		Console.WriteLine("りんご");
		break;
	case 1:
		Console.WriteLine("みかん");
		break;
	case 2:
		Console.WriteLine("バナナ");
		break;
	default:
		Console.WriteLine("不明です");
		break;
}

これを三項演算子で書くとこうなります。

int fruitId = 0
Console.WriteLine(
           fruitId == 0 ? "りんご" 
        : (fruitId == 1 ? "みかん" 
        : (fruitId == 2 ? "バナナ" 
                        : "不明です")));

書けなくはないけど、めっちゃ怒られそうですね。

悪乗りしてもう一つ。

int month = 3;
Console.WriteLine(month > 0 && month < 4 ? "春です" 
	: (month < 7 ? "夏です" 
	: (month < 10 ? "秋です" 
	: (month < 13 ? "冬です" 
	: (month % 12 == 0 ? "たぶん冬" 
	: (month % 12 < 4 ? "たぶん春" 
	: (month % 12 < 7 ? "たぶん夏" 
	: (month % 12 < 10 ? "たぶん秋" : "たぶん冬")))))));

月を入れると季節が返ってくる三項演算子です。おまけで13月とかオーバーフローした場合でもちゃんと季節が返ってくるようにしました。

2
2
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?