C#

【C#】制御文③:ジャンプステートメント

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

break文

break文は繰り返し処理を中断しループから抜けます。早速、コードを見てみましょう。

コード

using System;

internal class Program
{
    static void Main(string[] args)
    {
        int i = 0;
        while(true)
        {
            Console.WriteLine("iの値は{0}です",i);
            if (i > 2)
            {
                Console.WriteLine("i={0}でループを終了します", i);
                break;
            }
            i++;
        }
    }
}

出力結果

iの値は0です
iの値は1です
iの値は2です
iの値は3です
i=3でループを終了します

上記コードではif文でi>2となったときにbreak文を実行してます。break文を実行すると、以降の繰り返し処理は行いません。すなわち繰り返し処理から抜け出します。

continue文

continue文はbreak文と同じように繰り返し処理で使用します。break文は繰り返し処理を中断して抜けるのに対して、continue文はループのcontinue文以降の処理は行わずに次のループへ移ります。 コードを見てみましょう。

コード

using System;

internal class Program
{
    static void Main(string[] args)
    {
        for (int i = 0; i < 4; i++)
        {
            if (i == 1)
            {
                Console.WriteLine("Continue文で次のループに飛びます");
                continue;
            }
            Console.WriteLine("iの値は{0}です", i);
        }
    }
}

出力結果

iの値は0です
Continue文で次のループに飛びます
iの値は2です
iの値は3です

上記コードではi=1のときだけ、if文内のcontineuが実行されます。continue文が実行されると、以降の処理は実行されず、次のi=2のループに入ります。

goto文

goto文は処理を設定したラベルに飛ばすときに使います。下記のコードの7行目がラベルです。ラベルの表記方法は、ラベル名の後に:(コロン)をつけるだけです。ここではコードの最初にSTARTというラベルを設定しています。

コード

using System;

internal class Program
{
    static void Main(string[] args)
    {
        START:
        Console.Write("整数を入力してください:");
        int n = int.Parse(Console.ReadLine());
        if (n > 10)
        {
            Console.Write("もう一度10未満の");
            goto START;
        }
    
        Console.WriteLine("入力された整数は{0}です", n);
    }
}

出力結果

整数を入力してください:14
もう一度10未満の整数を入力してください:12
もう一度10未満の整数を入力してください:5
入力された整数は5です

上記コードでは、ユーザーが10以上の整数を入力したときに10未満の整数を入力し直すように促しています。このように、コードのどこにでも無条件で飛ばすことができるのが、goto文です。

goto文は無条件にコードを飛ばしますので、スパゲッティコードになりやすいので、使わないのが普通です。goto文は使用しなくても書けないコードはありません。

せいぜい使うとすれば、下記のように多重ループから抜けるときです。

コード

using System;

internal class Program
{
    static void Main(string[] args)
    {
        for(int i=0; i <10;i++)
        {
            for(int j=0; j<3;j+=2)
            {
                Console.WriteLine("{0}+{1}={2}です", i, j, i + j);
                if (i + j > 3) goto LOOP_END;
            }
        }
    LOOP_END:
        Console.WriteLine("LOOP_ENDへジャンプしました");
    }
}

出力結果

0+0=0です
0+2=2です
1+0=1です
1+2=3です
2+0=2です
2+2=4です
LOOP_ENDへジャンプしました

return文

return文は、メソッドを終了し呼び出し元に制御を戻します。返値のあるメソッドの場合にはreturn文の後に返値となる式を書きます。返値のないメソッドであれば、何も書きません。

コード

using System;

namespace ConsoleApp
{
    internal class Program
    {
        static void Main(string[] args)
        {
            Console.Write("正の整数を入力してください:");
            int n = int.Parse(Console.ReadLine());
            long f = Factorial(n);
            Console.WriteLine("{0}!={1}です", n, f);
        }

        public static long Factorial(int n)
        {
            if (n == 0) return 1;
            return n * Factorial(n - 1);
        }
    }
}

出力結果

正の整数を入力してください:4
4!=24です

上記コードは再帰処理により整数の階乗を求めます。階乗を求めるメソッドFactorialは17行目でn==0の時には1を返しメソッドを終了します。n==0でない場合には次の18行目のn*Factorial(n-1)により再帰処理を行っています。

次は返値のない形です。

コード

using System;

namespace ConsoleApp
{
    internal class Program
    {
        static void Main(string[] args)
        {
            int a = 1, b = 2;
            Console.WriteLine("a={0}, b={1}", a, b);
            Console.Write("スワップを実行しますか?(y/n):");
            string flg = Console.ReadLine();
            swap(ref a, ref b, flg);
            Console.WriteLine("a={0}, b={1}", a, b);
        }

        static void swap(ref int x, ref int y, string flg)
        {
            if (flg == "n") return;
            int temp = x;
            x = y;
            y = temp;
        }
    }
}

出力結果

a=1, b=2
スワップを実行しますか?(y/n):n
a=1, b=2

上記コードでは、swapメソッドを呼び出していますが、このswapメソッドはstring型の変数flg==”n”だと何もせず終了して呼び出し元に制御を返すメソッドになっています。flgが”n”以外ならば2つの変数の値をスワップ(交換)します。

switch文とジャンプステートメント

switch文の中でもジャンプステートメントが使われます。

コード

using System;

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

            switch (n)
            {
                case 0:
                    Console.WriteLine("case 1の処理です。case 2ラベルに飛ばします。");
                    goto case 2;
                case 1:
                    Console.WriteLine("これはcase 1の処理です。return文により終了します");
                    return;
                case 2:
                    Console.WriteLine("これはcase 2の処理です。defaultラベルに飛ばします。");
                    goto default;
                case 3:
                    Console.WriteLine("これはcase 3の処理です。SW_ENDラベルに飛ばします");
                    goto SW_END;
                default:
                    Console.WriteLine("これはdefaultの処理です。break文で終了します。");
                    break;
            }
            SW_END:
            Console.WriteLine("switch文が終わりました。");
        }
    }
}

出力結果

0~3の整数を入力してください:0
case 1の処理です。case 2ラベルに飛ばします。
これはcase 2の処理です。defaultラベルに飛ばします。
これはdefaultの処理です。break文で終了します。
switch文が終わりました。

switch文の各ラベルの最後には通常break文を書きますが、goto文やreturn文も書くことができます。goto文では、switch文内のcaseラベルやdefaultラベルのほかにswitch文の外のラベルにもジャンプさせることができます。

終わりに

以上、C#の制御文のひとつであるジャンプステートメントのbreak文、continue文、goto文、return文について解説しました。他の制御文については下記もご覧ください。

【C#】制御文①:条件分岐~選択ステートメント~
【C#】制御文②:繰り返し処理~繰り返しステートメント~

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

COMMENT

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