C# 制御文-条件文-

C#

条件文

ここでは、制御文の中の条件文についてみていきます。

C#の条件文は、if-else if-else構造のif文、switch-case文があります。

これら条件文の書き方と例をまとめています。

最後にあまり使わない方が良いですが、強制分岐のgoto文を記述しています。

C#制御文の繰り返し文については、こちら別ページにまとめています。

C# 制御文-繰り返し文-
C#の繰り返し文(while,do while,for,foreach)の構造と使い方について記載します。

if 文

if文による条件分岐処理は、設定する条件に対して処理をするかしないかという場合に使います。

条件に書かれた式が真(1)の場合、ブロック内の処理が実行されます。

条件式が偽(0)の場合は、ブロック外の処理に進みます。

if – else 文

if文は、条件に対して処理をするかしないかというものでしたが、処理をしない場合に別の処理を実行したいというときがあるかと思います。そのような場合には、else節を記述します。

条件に記述した式が真の場合、if節のブロックにある処理1が実行されます。この場合、処理1を実行後、else節のブロックにある処理2を飛ばして、ブロック外のプログラムに処理を進めます。

条件式が偽の場合、else節のブロックにある処理2を実行します。この場合は、処理1は実行されません。処理2実行後、ブロック外のプログラムに処理を進めます。

if – else if 文

if文の条件判断は、複数連ねることができます。その時に使うのがelse if節になります。

条件1式の評価が真の場合、if節のブロック内の処理1が実行され、その後、if-else if文の外にプログラムが進みます。

条件1式の評価が偽の場合、else if節の条件2式の評価が実行されます。

条件2式の評価が真の場合、else if節のブロック内の処理2が実行され、その後、if-else if文の外にプログラムが進みます。

条件2式の評価が偽の場合、if-else if文のブロック外にプログラムが進みます。

この例では、else if節が1つですが、さらにelse if節を追加して、条件判断を連ねることができます。

また、すべての条件が偽の場合に何かしらの処理を実行させたい場合は、else節を追加してelse節のブロック内にその処理を記述します。

if-else if-else文の例

else if節、else節をもつif文の例を記載します。

この例を実行すると「0」から「3」までのキーボード入力待ちとなります。

0を入力するとプログラムを終了するようになっています。

入力値によって、それぞれ、条件文の各節を通るようになっているので、「4」、「3」、「2」、「1」、「0」の順にキー入力してみます。

キー入力後、「ENTER」キー押下でプログラムが実行されます。

「4」は、入力の範囲外ですが、例外処理的な確認として入力しています。

using System;

namespace ConditionalsTest
{
    class ConditionalsTest
    {
        static void Main(string[] args)
        {
            string str;

            while(true)
            {
                Console.Write("\n入力(0で終了)[0-3]:");
                str = Console.ReadLine();
            
                //if else if else 文
                Console.WriteLine("\n------if conditionals------");

                if( str == "0" )
                {
                    Console.WriteLine("{0}:if program",str);
                }
                else if( str == "1" )
                {
                    Console.WriteLine("{0}:else if program",str);
                }
                else if( str == "2" )
                {
                    Console.WriteLine("{0}:else if program",str);
                }
                else if( str == "3" )
                {
                    Console.WriteLine("{0}:else if program",str);
                }
                else
                {
                    Console.WriteLine("{0}:else program",str);
                }

      //goto 文
                if( str == "0" )
                {
                    Console.WriteLine("\ngoto program");
                    goto END;
                }

            }
END:
            Console.WriteLine("\nend");
        }

    }
}

入力した結果です。それぞれ指定した値に対して、if節、else if節、else節が実行されたことが確認できます。

入力(0で終了)[0-3]:4
------if conditionals------
4:else program

入力(0で終了)[0-3]:3
------if conditionals------
3:else if program

入力(0で終了)[0-3]:2
------if conditionals------
2:else if program

入力(0で終了)[0-3]:1
------if conditionals------
1:else if program

入力(0で終了)[0-3]:0
------if conditionals------
0:if program

goto program

end

switch case文

条件分岐の制御文としてswitch case文があります。

if – else if – else文を使っても実装できるのですが、else if節が多くなる場合は、switch case文を使った方が見やすく、実行速度が速いので利点が多いかと思います。

switch case文は、switchで指定する式の値を各caseの値と比較して、一致したところの処理を実行します。上図では、式の値とcaseの値1を比較します。ここで値が互いに等しい場合、処理1が実行されます。処理1実行後、breakによりswitchのブロック処理を抜け出し、ブロック外のプログラムに処理を進めます。

式の値とcaseの値1が不一致の場合、次のcase文の値2と式の値を比較します。

一致する場合は、処理2を実行し、処理2実行後、breakによりブロックを抜け出します。不一致の場合、default節の処理defを実行し、switchのブロック処理を抜けます。

C#のswitch文は、default節も含め、case内のbreakがないとコンパイル時にエラーとなります。C言語では、エラーにはなりませんが、C#では、必ずbreakを記述する必要があります。

switch case文の例になります。

if文の例と同じように、プログラム実行後、「0」から「3」のキー入力待ちになります。「4」、「3」、「2」、「1」、「0」の順に入力した結果、各caseに対応するプログラムが実行されています。

using System;

namespace ConditionalsTest
{
    class ConditionalsTest
    {
        static void Main(string[] args)
        {
            string str;

            while(true)
            {
                Console.Write("\n入力(0で終了)[0-3]:");
                str = Console.ReadLine();
            
                //switch case 文
                Console.WriteLine("\n--switch case conditionals--");

                switch( str )
                {
                    case "0":
                        Console.WriteLine("case:{0} program",str);
                        break;

                    case "1":
                        Console.WriteLine("case:{0} program",str);
                        break;

                    case "2":
                        Console.WriteLine("case:{0} program",str);
                        break;

                    case "3":
                        Console.WriteLine("case:{0} program",str);
                        break;

                    default:
                        Console.WriteLine("default:{0} program",str);
                        break;
                }

                //goto 文
                if( str == "0" )
                {
                    Console.WriteLine("\ngoto program");
                    goto END;
                }
            }
END:
            Console.WriteLine("\nend");
        }
    }
}
入力(0で終了)[0-3]:4
--switch case conditionals--
default:4 program

入力(0で終了)[0-3]:3
--switch case conditionals--
case:3 program

入力(0で終了)[0-3]:2
--switch case conditionals--
case:2 program

入力(0で終了)[0-3]:1
--switch case conditionals--
case:1 program

入力(0で終了)[0-3]:0
--switch case conditionals--
case:0 program

goto program

end

拡張switch-型switch-

C#のバージョン7.0から追加されたswitch文の拡張機能として、型変換が可能かを評価して処理を選択するswitch文があります。

「オブジェクト」が「型1」に型変換(キャスト)可能かを評価して、可能な場合、その型の「変数1」にオブジェクトが格納され、「処理1」が実行されます。

この拡張switchのcaseには、条件式を追加することもできます。

「オブジェクト」が「型2」に型変換できる場合で「条件式」の条件を満たす場合、その型の「変数2」にオブジェクトを格納し、「処理2」を実行します。

「オブジェクト」が何れのcaseとも一致しない場合は、「処理def」が実行されます。

以下、サンプルプログラムになります。

using System;

namespace ConditionalsTest
{
    class ConditionalsTest
    {
        static void Main(string[] args)
        {
            string str;

            while(true)
            {
                Console.Write("\n入力(0で終了)[0-3]:");
                str = Console.ReadLine();
            
                //拡張 switch case 文 (C# ver.7.0) -型スイッチ-
                Console.WriteLine("\n--extra switch case conditionals 1--");
                object obj;
                if( str == "1" )
                {
                    Int16.TryParse(str,out Int16 num);
                    obj = num;
                }
                else if( str == "2" )
                {
                    Int32.TryParse(str,out Int32 num);
                    obj = num;
                }
                else
                {
                      obj = str;
                }

                switch( obj )
                {
                    case Int16 n:
                        Console.WriteLine("ex switch type Int16:{0}",n);
                        break;
                    case Int32 n:
                        Console.WriteLine("ex switch type Int32:{0}",n);
                        break;
                    case string s when str == "3":
                        Console.WriteLine("ex switch type string:{0}",s);
                        break;
                    default:
                        Console.WriteLine("ex switch default");
                        break;
                }
                //goto 文
                if( str == "0" )
                {
                    Console.WriteLine("\ngoto program");
                    goto END;
                }
            }
END:
            Console.WriteLine("\nend");
        }
    }
}

入力(0で終了)[0-3]:4
--extra switch case conditionals 1--
ex switch default

入力(0で終了)[0-3]:3
--extra switch case conditionals 1--
ex switch type string:3

入力(0で終了)[0-3]:2
--extra switch case conditionals 1--
ex switch type Int32:2

入力(0で終了)[0-3]:1
--extra switch case conditionals 1--
ex switch type Int16:1

入力(0で終了)[0-3]:0
--extra switch case conditionals 1--
ex switch default

goto program

end

拡張switch文-switch式-

C#のバージョン8.0から追加されたswitch文の拡張機能として、switch式というものがあります。この記述を使うと、caseやdefaultといった文言を使わないので、見た目がすっきりとします。

「式」の値が「値1」と一致する場合、「変数」に「値1’」を格納します。

上記を満たさない場合で、「式」の値が「値2」と一致する場合、「変数」に「値2’」を格納します。

「値1」、「値2」どちらとも一致しない場合、「変数」に「値3’」を格納します。

「_」(アンダースコア)の記述は、default節に相当する処理になります。

switch式のサンプルプログラムを記述します。

using System;

namespace ConditionalsTest
{
    class ConditionalsTest
    {
        static void Main(string[] args)
        {
            string str;

            while(true)
            {
                Console.Write("\n入力(0で終了)[0-3]:");
                str = Console.ReadLine();
            
                //拡張 switch case 文 (C# ver.8.0) -スイッチ式-
                Console.WriteLine("\n--extra switch case conditionals 2--");
                int m = str switch
                {
                    "0" => 0,
                    "1" => 1,
                    "2" => 2,
                    "3" => 3,
                     _  => 9999
                };
                Console.WriteLine("ex switch :{0}",m);

                //goto 文
                if( str == "0" )
                {
                    Console.WriteLine("\ngoto program");
                    goto END;
                }

            }
END:
            Console.WriteLine("\nend");
        }

    }
}
入力(0で終了)[0-3]:4
--extra switch case conditionals 2--
ex switch :9999

入力(0で終了)[0-3]:3
--extra switch case conditionals 2--
ex switch :3

入力(0で終了)[0-3]:2
--extra switch case conditionals 2--
ex switch :2

入力(0で終了)[0-3]:1
--extra switch case conditionals 2--
ex switch :1

入力(0で終了)[0-3]:0
--extra switch case conditionals 2--
ex switch :0

goto program

end

goto文

goto文は、処理を強制的に分岐させるときに使用しますが、多用すると分岐が複雑になり、プログラムの流れが追いにくくなるという理由で、あまり推奨されません。

goto文により、ラベル位置以降の処理を実行します。

上図では、goto文により処理1は実行されず、処理2が実行されます。

if文、switch文の例でgoto文を使ってwhile文の繰り返し処理を強制的に抜けるようにしています。while文の無限ループの脱出は、breakで記述する方が良いかと思いますが、使用例として、goto文を使ってみました。

コメント

タイトルとURLをコピーしました