同じ処理を繰り返し実行することは、コンピュータプログラムの基本中の基本である。これを実現するために、C#では4種類のステートメントが用意されている。List 9-4に4種類のステートメントを使用した例を示す。
1: using System;
2:
3: namespace Sample004
4: {
5: class Class1
6: {
7: [STAThread]
8: static void Main(string[] args)
9: {
10: int [] ar = new int[] { 0,1,2,3,4,5,6,7,8,9 };
11:
12: Console.Write("for ");
13: for( int i=0; i<10; i++ )
14: {
15: Console.Write(ar[i]);
16: }
17: Console.WriteLine(" done");
18:
19: Console.Write("while ");
20: int j=0;
21: while( j<10 )
22: {
23: Console.Write(ar[j]);
24: j++;
25: }
26: Console.WriteLine(" done");
27:
28: Console.Write("do ");
29: int k=0;
30: do
31: {
32: Console.Write(ar[k]);
33: k++;
34: } while( k<10 );
35: Console.WriteLine(" done");
36:
37: Console.Write("foreach ");
38: foreach( int l in ar )
39: {
40: Console.Write(l);
41: }
42: Console.WriteLine(" done");
43: }
44: }
45: }
このサンプル・ソースを実行した結果はFig.9-4のようになる。
最初に細かい説明をしておくと、10行目は整数の配列の初期値を設定した宣言である。10個の要素を持つ配列で、0から9までの値がそれぞれに格納された配列が用意される。この内容を4種類のステートメントで出力してみたい(配列の詳細は後で解説する)。
13行目のforは、セミコロン(;)で区切られた3つの式を指定する。最初の式(int i=0)は初期化である。2番目の式(i<10)は終了条件となる式である。ここでは変数iが10より小さい間は繰り返しを続けるという意味を持つ。3番目の式(i++)は繰り返し時に実行される式である。ここでは内容を1回実行するごとに変数iに1を加えるという処理が指定されている。これらを総合して、変数iが0から9まで1ずつ増えながら、15行目が10回実行されるのである。
21行目のwhileは、指定された式が成立している間、繰り返す機能を持つ。条件の判定は内容を実行する前に行われるので、最初から条件が成立していなければ、1回も内容を実行しない場合がある。ここでは24行目で変数jを1ずつ大きくしながら、10回繰り返すことになる。
30行目のdoは、whileというキーワードとともに使うがあくまでdoステートメントであって、whileステートメントとは別のものである。whileステートメントと異なるのは、条件の判定が内容の実行後に行われることである。つまり、条件が不成立のまま繰り返しが始まった場合でも、1回は内容を実行してしまうのである。
38行目のforeachは、Visual Basicプログラマーにはおなじみかもしれない。foreachの後の括弧内で指定された「int l in ar」という指定は、整数型のlという名前の変数を宣言し、その変数の中に、配列arの内容を1個ずつ代入することを意味する。内容を1個代入するごとに、foreachの処理内容、つまり40行目が実行される。その結果、38行目のforeachステートメントには繰り返す回数の指定がないにもかかわらず、10回繰り返して終了する。10回になる理由は、配列arが10個の大きさだからである。また、40行目の引数はlであり、「ar[l]」ではないことに注目していただきたい。foreachでは、ある値が何番目かということは重要な意味を持たない。
foreachは、配列だけでなく、データの集まりを扱う多くのクラスに適用できる。また自作クラスでも、foreachを適用可能にすることができる(方法は「第14章 インターフェイスの活用」で詳しく解説する)。
繰り返しは、指定した回数の最後まで実行させなければならないものではないし、処理内容を必ず最後まで実行させなければならないものでもない。List 9-5はそれを示したサンプル・ソースである。
1: using System;
2:
3: namespace Sample005
4: {
5: class Class1
6: {
7: [STAThread]
8: static void Main(string[] args)
9: {
10: for( int i=0; i<10; i++ )
11: {
12: if( i<4 )
13: {
14: continue;
15: }
16: if( i==7 )
17: {
18: break;
19: }
20: Console.WriteLine(i);
21: }
22: }
23: }
24: }
このサンプル・ソースを実行した結果はFig.9-5のようになる。
繰り返しをコントロールする手段が2つある。1つはcontinueステートメントによって、処理を打ち切って繰り返しを続行する方法、もう1つは、breakステートメントによる繰り返しからの脱出である。
List 9-5を見ていただきたい。基本的には、10行目のforステートメントによって、20行目の出力を繰り返し実行させようとしている。そこに、12〜19行目の記述内容が割り込んで、繰り返しを意識的にコントロールするように組まれている。まず最初に、12〜15行目の記述により、変数iの値が4より小さい場合はcontinueが実行される。continueはそこで処理を打ち切って繰り返しを続けるので、continueが実行されると16〜20行目が実行されることはない。変数iが4以上になると、continueは実行されなくなり、20行目が実行され、数値がコンソールに出力される。しかし、変数iが7に達すると、18行目のbreakが実行される。breakは繰り返しをその場で終了させる働きがあるので、breakが実行された瞬間に21行目に飛ぶ。そのため、変数iが8や9になることはない。
なお、後で説明するgotoステートメントは繰り返しから脱出するためのものではないが、繰り返しの内側で外側のラベルの名前を付けて記述すれば、繰り返しからの脱出として機能することを付記しておく。
Copyright© Digital Advantage Corp. All Rights Reserved.