C#_条件分岐


C#における条件分岐についてまとめていきます。
どの言語でも使えるように **"if"** と **"switch"** があります。

本文は以下の記事の内容を前提に記述しています。

* [C#_変数宣言と型・キャスト](https://qiita.com/MtBigYashi/items/a35b6ad1514be867f14a)

* [C#_単項・二項・三項演算子](https://qiita.com/MtBigYashi/items/198bf9756204d6d54e40)

## if-else文

ある処理Aと処理Bのどちらを実行するか、その時の条件によって分岐させたい場合、if文を使用していきます。
また、同時にその条件を満たさなかった場合の処理をelseによって記述することもできます。

```C#:Program.cs
if (a == 5)
{
    Console.WriteLine("a is equal 5");
}
else
{
    Console.WriteLine("a is NOT equal 5");
}
```

```TXT:a=5
> a is 5
```

```TXT:a=8
> a is NOT 5
```

さらに、else以降に重ねてif文を繋げることで連続して条件分岐を行うことが可能です。

```C#:Program.cs
if (a == 5)
{
    Console.WriteLine("a is equal 5");
}
else if (a > 5)
{
    Console.WriteLine("a is larger than 5");
}
else if (a == 0)
{
    Console.WriteLine("a is equal zero");
}
else
{
    Console.WriteLine("a is smaller than 5 and NOT equal zero");
}
```

```TXT:a=5
> a is equal 5
```

```TXT:a=8
> a is larger than 5
```

```TXT:a=0
> a is equal zero
```

```TXT:a=-1
> a is smaller than 5 and NOT equal zero
```

if文の( )の中に入る式を **"条件式（評価式）"** と呼び、条件式はbool値（論理値）を返す必要があります。

条件式はOR演算やAND演算によって複数の式を結合することが可能です。

```C#:Program.cs
if (a == 0 || 10 < a)
{
    Console.WriteLine("a is equal zero OR larger than 10");
}
else if (-5 < a && a <= 10)
{
    Console.WriteLine("a is larger than -5 AND equal or smaller than 10");
}
else
{
    Console.WriteLine("a is smaller than -5");
}
```

```TXT:a=0
> a is equal zero OR larger than 10
```

```TXT:a=20
> a is equal zero OR larger than 10
```

```TXT:a=3
> a is larger than -5 AND equal or smaller than 10
```

```TXT:a=-15
> a is smaller than -5
```

## 短絡評価

C#に限らずですが、実はOR演算やAND演算では **"短絡評価"** という評価法が採用されています。

どういう方法かというと、ORやANDによって複数の条件式が結合された時、
1つずつ式を評価していき、途中で結果が確定した段階で以降の評価をスキップする動きになります。

次の例を見てみましょう

```C#:Program.cs
int a = 0, b = 0;
if (a == 0 || b++ == 10)
{
    a++;
}

if (a < 0 && b++ == 1)
{
    a++;
}
Console.WriteLine("a = " + a);
Console.WriteLine("b = " + b);
```

```TXT:出力
> a = 1
> b = 0
```

インクリメントを多用していますが、まず最初のif文から見ていきます。

> if (a == 0 || b++ == 10)

このif文ではまず最初に左側の"a == 0"を評価し、これがtrueであることが分かります。

その次にOR演算が来ますが、OR演算は被演算子（||の両端にある式）の内
「少なくとも一方が真であれば全体の結果も真」だと言えるので
以降の評価"b++ == 10"を実行せず、if文の中に入って"a++"を実行します。

さて次のif文を見ていきましょう。

> if (a < 0 && b++ == 1)

これも先ほどと同様にまず左側から見ていき、"a < 0"を評価したところa = 1なので"a < 0 → false"であることが分かります。

AND演算では「被演算子の少なくとも一方が偽であれば全体が偽」だと言えるので、
この場合にも、以降の評価"b++ == 1"は実行されません。

if文の結果は偽でしたのでその中に入らず処理を終了します。
最終的にaは一度だけインクリメントされて1に。bは一度も値を変更されることなく0のままであることが確認できます。

---

今回は例としてインクリメントを使用していますが、可読性の考慮すると評価式中に変数の値を更新するのは非推奨です。
その式が実行されたかどうかがパッと見で分かりづらいので、できるだけ分かりやすい書き方を心掛けましょう

## switch-case文

さて、if文以外にも条件によって実行内容を分岐させる方法が **"switch-case文"** になります。
実際に動きを見てみましょう。

```C#:Program.cs
switch (a)
{
    case 0:
        Console.WriteLine("a is equal 0");
        break;
    case 1:
        Console.WriteLine("a is equal 1");
        break;
    default:
        Console.WriteLine("a is unknown");
        break;
}
```

```TXT:a=0
> a is equal 0
```

```TXT:a=1
> a is equal 1
```

```TXT:a=3
> a is unknown
```

動きを見ればわかる通り、aの値によって処理が変わる点についてはif-else文と同じです。

switch-case文は選択肢が系統的に列挙できる場合、if-else文よりも可読性を上げることができます。
例えばaの値が1~10まで全てについて異なる処理をしたい場合、switch-case文の方が有用です。

反対に、a < 5の様な範囲指定をする評価をする場合にはif-elseが必要になるので、
その時々によってうまく使い分けられるようにしましょう

今回はここまで。