連載

C#入門

第9 ステートメント

(株)ピーデー
川俣 晶
2001/08/03


分岐

 条件によって実行するステートメントを変える手段は2つある。1つは、ifステートメントによる条件判断で、条件判断式が成立したときと成立しないときで処理内容を分けることができる。もう1つは、switchステートメントで、式の値によって処理を分けることができる。

 以下に示すサンプル・プログラムにおいて、9行目のif条件式に書かれたargs.Lengthは、コマンドライン引数に何個の値が指定されたかを示すプロパティである。つまりコマンドラインからこのサンプルソースを実行するときに、何か文字列を付け加えなければプロパティの値はゼロになり、付け加えたらその個数を値として持つ。ここでは条件判断の動きを見るために使ったもので、深い意味はない。

 9行目のifは、“args.Length != 0”つまりコマンドラインに何か書いてあれば11行目を実行し、そうでなければ13行目を実行する。10〜12行目と12〜14行目の“{”と“}”はブロック・ステートメントである。

 15行目のswitchは、カッコ内の値と、続くcaseの後の値を比較し、一致したらcase以後のステートメントを実行する。つまり、args.Lengthの値がゼロなら、17行目の“case 0”が成立して、18〜19行目が実行される。caseは何個でも書くことができるが、いずれにも合致しない場合は“default:”以後が実行される。つまり、この場合はargs.Lengthの値がゼロ以外のときは、21〜22行目が実行される。

 さて、switchステートメントの中で使用されるbreakは、処理を終了してswitchステートメントから抜け出す機能を持ったキーワードである。breakが出現すると、そこで処理は打ち切られて、switchステートメントの次のステートメントが実行される。このとき、処理を終了させるのではなく、別のcaseの条件処理にジャンプさせたい場合がある。そのような場合は、breakの代わりに“goto case”という構文を使う。31行目がそれを使った実例である。args.Lengthが1のとき、30〜31行目が実行されるが、31行目の“goto case 2”によって、“case 2”へ制御が移り、33〜34行が実行される。34行に書かれた“goto defalt”はdefaultへ制御を移す機能を持っていて、これによりさらに36〜37行目が実行され、37行目のbreakによって、やっとswitchステートメントから脱出することになる。

 ここで、C/C++プログラマは注意して欲しいのだが、C#はbreakまたはgotoを用いないで、次のcaseの処理にそのまま入って行くことは許されない。そのような処理が必要な場合は、“goto case”を用いて、明示的に次に処理するべき先を指定しなければならない。似ているが異なっているので注意が必要だ。

 C#のswitchステートメントでは、文字列(string)を扱うこともできる。39〜47行のswitchステートメントがその実例を示したものだ。39行目の“args[0]”は、コマンドラインの引数に指定された最初の文字列を示す(なお、ここにはエラーチェックのコードが入っていないので、引数なしでプログラムを実行すると、39行目で例外が発生して停止することを付記しておく)。もし、“args[0]”の値が"hello"なら、42〜43行目が実行される。それ以外の文字列なら45〜46行目が実行される。

 1: namespace ConsoleApplication17
 2: {
 3:   using System;
 4:
 5:   public class Class1
 6:   {
 7:     public static int Main(string[] args)
 8:     {
 9:       if( args.Length != 0 )
10:       {
11:         Console.WriteLine("yes args");
12:       } else {
13:         Console.WriteLine("no args");
14:       }
15:       switch( args.Length )
16:       {
17:         case 0:
18:           Console.WriteLine("no args");
19:           break;
20:         default:
21:           Console.WriteLine("yes args");
22:           break;
23:       }
24:       switch( args.Length )
25:       {
26:         case 0:
27:           Console.WriteLine("args=0");
28:           break;
29:         case 1:
30:           Console.WriteLine("args=1");
31:           goto case 2;
32:         case 2:
33:           Console.WriteLine("args=2");
34:           goto default;
35:         default:
36:           Console.WriteLine("yes args");
37:           break;
38:       }
39:       switch( args[0] )
40:       {
41:         case "hello":
42:           Console.WriteLine("hello!");
43:           break;
44:         default:
45:           Console.WriteLine("not hello!");
46:           break;
47:       }
48:       return 0;
49:     }
50:   }
51: }
ifおよびswitchによる分岐を使用したサンプル・プログラム

 なお、このサンプルソースを実行した結果は以下のようになる。

プログラムの実行結果
C#のswitchステートメントでは、別のcaseに処理をとばす場合には、gotoを使用する必要がある。caseには数値だけでなく文字列を使用することができる。

繰り返し

 同じ処理を繰り返し実行することは、コンピュータプログラムの基本中の基本である。これを実現するために、C#は4種類のステートメントを用意している。以下のサンプルソースの中で、これら4種類のステートメントを使用した例を示す。なお、9行目は整数の配列を初期値に設定した宣言である。10個の要素を持つ配列で、0から9まで値がそれぞれに格納された配列が用意される。この内容を4種類のステートメントで出力してみたい。

 12行目のforは、セミコロン(;)で区切られた3つの式を指定する。最初の式“int i=0”は初期化である。2番目の式“i<10”は終了条件となる式である。ここでは変数iが10より小さい間は繰り返しを続けるという意味を持つ。3番目の式“i++”は繰り返し時に実行される式である。ここでは内容を1回実行するごとに変数iに1を加えるという処理が指定されている。これらを総合して、変数iが0から9まで1ずつ増えながら、14行目が10回実行されるのである。

 20行目のwhileは、指定された式が成立している間、繰り返しを続ける機能を持つ。条件の判定は内容を実行する前に行われるので、最初から条件が成立していなければ、1回も内容を実行しない場合がある。ここでは23行目で変数jを1ずつ大きくしながら、10回繰り返すことになる。

 29行目のdoは、whileというキーワードとともに使うが、あくまでdoステートメントであって、whileステートメントとは別のものである。whileステートメントと異なるのは、条件の判定が内容の実行後に行われることである。つまり、条件が不成立のまま繰り返しが始まった場合でも、1回は内容を実行してしまう。

 36行目のforeachは、VisualBASICプログラマにはお馴染みかもしれない。foreachの後のかっこ内で指定された“int l in ar”という指定は、整数型のlという名前の変数を宣言し、その変数の中に、配列arの内容を1個ずつ代入することを意味する。内容を1個代入するごとに、foreachの処理内容つまり38行目が実行される。その結果、36行目のforeachステートメントには繰り返す回数の指定はないにもかかわらず、きっちり10回繰り返して終了する。10回になる理由は、配列arが10個の大きさだから、である。また、37行目の引数が“l”であって、“ar[l]”ではないことに注目していただきたい。foreachでは、ある値が何番目であるかは、重要な意味を持たない。

 foreachは配列だけでなく、データの集まりを扱う多くのクラスに適用できる。また自作クラスでも、foreachを適用可能にすることができる(IEnumerableを実装することで実現できるが、入門連載の趣旨にそぐわないので説明は割愛する)。

 1: namespace ConsoleApplication18
 2: {
 3:   using System;
 4:
 5:   public class Class1
 6:   {
 7:     public static int Main(string[] args)
 8:     {
 9:       int [] ar = new int[] { 0、1、2、3、4、5、6、7、8、9 };
10:
11:       Console.Write("for ");
12:       for( int i=0; i<10; i++ )
13:       {
14:         Console.Write(ar[i]);
15:       }
16:       Console.WriteLine(" done");
17:
18:       Console.Write("while ");
19:       int j=0;
20:       while( j<10 )
21:       {
22:         Console.Write(ar[j]);
23:         j++;
24:       }
25:       Console.WriteLine(" done");
26:
27:       Console.Write("do ");
28:       int k=0;
29:       do {
30:         Console.Write(ar[k]);
31:         k++;
32:       } while( k<10 );
33:       Console.WriteLine(" done");
34:
35:       Console.Write("foreach ");
36:       foreach( int l in ar )
37:       {
38:         Console.Write(l);
39:       }
40:       Console.WriteLine(" done");
41:
42:       return 0;
43:     }
44:   }
45: }
繰り返しのための4種類のステートメントを使用したサンプル・プログラム

 このサンプルソースを実行した結果は以下のようになる。

プログラムの実行結果
4つのステートメントを使用して、配列の各要素を順番に表示する。
 

 INDEX
  C#入門 第9回 ステートメント
    1.ステートメントとは
  2.分岐
    3.繰り返しのコントロール
 
「C#入門」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間