C#

【C#】制御文①:条件分岐~選択ステートメント~

C#の制御文は条件分岐を行う選択ステートメント、繰り返し処理を行う繰り返しステートメント、制御を移動するジャンプステートメントがあります。この記事ではC#の条件分岐を行う選択ステートメントについて、簡単なコードで解説します。C#の選択ステートメントにはには、if文、switch文があります。

if文

if ~ else

if文は英語のif(もし)の意味からも察せられるとおり「もし~のような条件ならば、…を実行する」のように条件で実行するかしないかを分岐させるときに使用します。またifとセットでelseというキーワードも使用します。elseも英語の意味である「それ以外」から察せられるように、「それ以外(if文の条件以外)ならば、…を実行する」という場合に使用します。

これを踏まえて、if文の構文を見てみましょう。

if(条件式) 文①;
else 文②;

これは「もし条件式がtrueならば文①を実行し、それ以外(条件式がfalse)ならば文②を実行する」という構文です。それ以外の場合の処理が不要な場合にはelseは省略できます。

文①、文②の箇所の処理が複数の文となる場合には、以下のように{}を使用した構文になります。

if(条件式)
{
  ステートメントブロック(複数の文)
}
else
{
  ステートメントブロック(複数の文)
}

なお、ステートメントブロック(複数の文)ではなく1行のステートメントであっても上記のような{}をつけてOKです。

ではif文を使用した例を見てみましょう。

コード

using System;

internal class Program
{
    static void Main(string[] args)
    {
        Console.Write("整数を入力してください:");
        var n = int.Parse(Console.ReadLine());

        if (n >= 0) Console.WriteLine("{0}は0以上です。", n);
        else Console.WriteLine("{0}は0未満です。", n);
    }
}

出力結果

整数を入力してください:15
15は0以上です。

上記コードは、ユーザーに整数を入力させて、その値が0以上か0未満かを表示します。if文の条件式は比較演算子>=を使用して変数nが0以上かどうかを判定しています。条件式の値がtrue(nが0以上)であればifの後の文の処理が実行され、false(nが0未満)であればelseの後の文の処理が実行されます。

なお、上記コードは{}を使用した下記コードと同じです。見やすいほうを使えばいいでしょう。

コード

using System;

internal class Program
{
    static void Main(string[] args)
    {
        Console.Write("整数を入力してください:");
        var n = int.Parse(Console.ReadLine());

        if (n >= 0)
        {
            Console.WriteLine("{0}は0以上です。", n);
        }
        else
        {
            Console.WriteLine("{0}は0未満です。", n);
        }
    }
}

if ~ elseの入れ子

if~elseの後にif~elseを続けて入れ子構造にすることができます。

if(条件式①)
{
  処理①
}
else if(条件式②)
{
  処理②
}

else
{
  elseの処理
}

これは、「もし(if)条件式①がtrueの場合には処理①が行われ、それ以外の場合でもし(else if)条件式②がtrueの場合には処理②が行われ、…、それ以外の場合(else)にはelseの処理が行われる」という場合に使用されます。else ifは必要なだけ重ねることができます。

例を見てみましょう。

コード

using System;

internal class Program
{
    static void Main(string[] args)
    {
        Console.Write("整数を入力してください:");
        var n = int.Parse(Console.ReadLine());

        if (n >= 10)
        {
            Console.WriteLine("{0}は10以上です", n);
        }
        else if (n >= 5)
        {
            Console.WriteLine("{0}は5以上10未満です", n);
        }
        else if (n >= 0)
        {
            Console.WriteLine("{0}は0以上5未満です", n);
        }
        else
        {
            Console.WriteLine("{0}は0未満です", n);
        }
    }
}

出力結果

整数を入力してください:7
7は5以上10未満です

上記コードでは、最初のif(10行目)で10以上かどうか、次のelse if(14行目)で5以上かどうか、次のelse if(18行目)で0以上かどうかを判定して当てはまればその処理を実行し、すべて当てはまらないときには最後のelse(22行目)の処理を実行します。

上記のコードは下記のコードと同じ処理ですが、上記のコードのほうが読みやすいでしょう。

コード

using System;

internal class Program
{
    static void Main(string[] args)
    {
        Console.Write("整数を入力してください:");
        var n = int.Parse(Console.ReadLine());

        if (n>=10)
        {
            Console.WriteLine("{0}は10以上です", n);
        }
        else
        { 
            if(n>=5)
            {
                Console.WriteLine("{0}は5以上10未満です", n);
            }
            else
            {
                if(n>=0)
                {
                    Console.WriteLine("{0}は0以上5未満です",n);
                }
                else
                {
                    Console.WriteLine("{0}は0未満です", n);
                }
            }
        }
    }
}

switch文

switch文の基本

switch文は指定した式が、複数の条件のどれに一致するかで処理を分岐します。まずは構文を見てみましょう。

switch(式)
{
  case 定数①:
    処理①
    break;
  case 定数②:
    処理②
    break;
  case 定数③:
    処理③
    break;
  …
  default:
    defaultの処理
    break;
}

この構文では「式が定数①と一致したら処理①を行い、式が定数②と一致したら処理②を行い、式が定数③と一致したら処理③を行い、・・・、式がどれとも一致しなかった場合にはdefaultの処理を行う」というものです。処理①、②、③…の箇所は複数の文を記述できますが最後にbreak文が必要です。break文は処理を終了させるときに使用されます。switch文で使用される場合にはswitch文を終了させることを意味します。「switchから抜ける」と表現する場合もあります。break文は省略できません(代わりにreturn,goto,throw(例外のスロー)を書くことができます)。
なお、最後のdefaultについては不要であれば省略可能です。省略した場合には、式がどの定数にも合致しない場合には何も処理しません。

switch文の具体例を見てみましょう。

コード

using System;

internal class Program
{
    static void Main(string[] args)
    {
        Console.Write("正の整数を入力してください:");
        var n = int.Parse(Console.ReadLine());

        switch(n)
        {
            case 0:
                Console.WriteLine("{0}はぜろとよみます", n);
                break;
            case 1:
                Console.WriteLine("{0}はいちとよみます", n);
                break;
            case 2:
                Console.WriteLine("{0}はにとよみます", n);
                break;
            case 3:
                Console.WriteLine("{0}はさんとよみます", n);
                break;
            case 4:
                Console.WriteLine("{0}はよんとよみます", n);
                break;
            default:
                Console.WriteLine("わたしは{0}はよめません", n);
                break;
        }
    }
}

出力結果

正の整数を入力してください:3
3はさんとよみます

上記コードでは構文の式にあたるのはnです。nの値によって条件が分岐しています。nが0のときはcase 0:の処理が行われ、nが1のときはcase 1:の処理が行われ…のようになります。

また、下記コードのcase 0:とcase 1:の箇所に処理を何も書かない(break文も書かない)場合には、nが0の場合も1の場合も次のcase 2:の処理が行われます。

コード

using System;

internal class Program
{
    static void Main(string[] args)
    {
        Console.Write("正の整数を入力してください:");
        var n = int.Parse(Console.ReadLine());

        switch(n)
        {
            case 0:
            case 1:
            case 2:
                Console.WriteLine("{0}は0か1か2のどれかです", n);
                break;
            case 3:
                Console.WriteLine("{0}はさんとよみます", n);
                break;
            case 4:
                Console.WriteLine("{0}はよんとよみます", n);
                break;
            default:
                Console.WriteLine("わたしは{0}はよめません", n);
                break;
        }
    }
}

出力結果

正の整数を入力してください:1
1は0か1か2のどれかです

そのほかswitch文には、いくつかルールがあります。以下はC# Ver6.0以前のルールです。

  • 定数は整数型(char型,byte型,int型など),bool型,string型または列挙型でなくてはならない
  • 定数の値は重複してはならない
  • 定数の値には変数は入らない(constで宣言した定数は可能)
  • 式の型と定数の型は互換性がなくてはならない

終わりに

ここでは条件分岐の基本的な構文であるif文、switch文について解説しました。なお、最近のswitch文はパターンマッチングという機能が追加されて、さらにいろいろなことができるようになっています。それについてはまた機会があれば解説したいと思います。
他の制御文については、下記もご覧ください。

【C#】制御文②:繰り返し処理~繰り返しステートメント~
【C#】制御文③:ジャンプステートメント

ABOUT ME
しかすけ
日々是好日。何とか何とか生きてます。

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です