同じことの繰り返し作業というのは、コンピュータの得意とするところの一つです。
ループ命令はいくつかありますが、どの命令を使うかはほぼプログラマの好みといって
いいでしょう。
恐らくは最もよく使われるのがこのforでしょう。
forが得意とするのは、カウンタを使ったループ処理です。
forは、括弧の中に3つの式を記述し、それぞれセミコロン(;)で区切ります。
初めは初期化処理、この式は一度だけ評価され、基本的にカウンタの初期化を行います。
次がループの継続条件。この条件がtrueのときに、ループは継続されます。
最後がカウンタ値の計算です。カウンタ値、としていますが、特にカウンタの計算をし
なければならないわけではないですが、他の計算を入れることはあまりありません。
forは、まず、初期化処理を行います。
次に、ループの継続条件を見ます。継続条件が満たされていれば、中括弧の処理を行い、
カウンタ値の計算を行います。
後は、継続条件のチェック、処理、カウンタ値の計算、を、繰り返します。
例
int[] array = new int[10];
for( int i = 0 ; i < 10 ; i ++ )
{
array[i] = i;
}
配列array[0]~array[9]に、それぞれ0~9を代入する処理です。
forの括弧の中身を見てください。
この例ではまず初めにiを宣言し、初期化しています。
特にここで宣言する必要は無く、forの外に宣言を置いてもかまいません。
というより、Cユーザーならばforの中で宣言するというのに、少々戸惑いを覚えるかも
しれませんが、なれちゃうと便利です(嫌う人も居ますが)
次が、ループの継続条件です。
iが10未満ならば、ループを継続します。
逆に言えば、iが10以上になると、ループを終了させるという事になります。
最後が、カウンタの計算。
i++、なので、iに1を加算しています。
つまり、このループはまずiを0クリア。
継続条件がiが10未満、なので、括弧の中を実行。処理が終わったらiに1を足し、継続
条件をチェック。
iは1なので、括弧の中を実行……というのを繰り返します。
forの各式はオプションです。
必要が無ければ書かなくてもかまいません。
for(;;)
なんて書き方でも間違いではありません。
別に、forが泣いているのを顔文字で表しているわけではなく、このような記述をする
と無限ループの意味になります。
forの継続条件を満たしているにもかかわらず、途中で抜けたい場合はbrake文を使いま
す。
forを使って無限ループを記述した場合は、brakeで抜けるのがほぼ必須になるでしょう。
brakeは、他のループにも使用できます(というか、forでbrake文はあまり使わないんで
すけどね)
例
int i = 0;
int[] array = new int[10];
for(;;)
{
array[i] = i;
i++;
if( i >= 10 )
{
break;
}
}
なんてバカなコードなんだろう……
for( i = 0 ; i < 10 ; i++)
を、無限ループを使って同じことをするとこうなりますっていう例です。
勿論、こんなコードを書いてはいけません。
ちなみに、終了条件を==ではなく、>=で見ているのは、もし、iが何らかの原因で10以上
になってしまった場合、凄い数をループしてしまうからです。
勿論、こんな短いコードでそんなことが起こるわけは無いのですが、プログラムが複雑
になると、カウンタのインクリメントを失敗してしまうということが起こらないとはい
えません。
whileはforより幾分シンプルで、まず、括弧の中の式を評価します。
結果がtrueであれば、中括弧の中を実行します。
例
int i = 0;
int[] array = new int[10];
while( i < 10 )
{
array[i] = i;
i++;
}
forの例、whileバージョンです。
このような、カウンタを使ったループはwhileではなくforを使うべきですが、まぁ、分
かりやすいように、という事で一つ。
whileは、特定の状態になるまで、繰り返し処理を行うような作業に向いています。
例えば、a,b,cという何れかの処理が終了するまで処理を続ける、といった具合です。
ちなみに、while文は無限ループを記述する際によく使われます。
C/C++の場合はwhile(1)とかだったんですが、評価できるのはbool型のみなので、C#では
while(true)のように書きます。
先頭にdo、最後にwhileを記述し、最後にセミコロンをつけること以外はwhileとほぼ同
じです。
whileに記述した式が、trueである間、中括弧の中を実行します。
whileと異なるのは、まず中括弧の中を実行した後式を評価することにあります。
つまり、for,whileでは、一度も処理をせずにループを抜ける可能性がありますが、
do/whileでは最低一回処理を行います。
例
int i = 0;
int[] array = new int[10];
do
{
array[i] = i;
i++;
}while( i < 10 );
動きはwhileの例と全く一緒です。
C/C++ユーザーにはなじみの無いループですが、foreachは配列、又はコレクション用の
ループです。
例
int[] array = new int[]{2,4,6,8,10};
foreach( int i in array )
{
System.Console.WriteLine(i);
}
System.Console.ReadKey();
このコードを試す場合は、新規プロジェクトで、コンソールアプリケーションの作成を
行ってください。
System.Console.WriteLineはコンソールへ文字を出力する関数です。
foreachは、配列の大きさ分繰り返し実行します。
iには、初めはarray[0]、次はarray[1]の……というように、対象の配列に格納されてい
るデータを順番に代入してくれます。
この例では、2,4,6,8,10と、コンソール(DOSプロンプト)に表示されます。
尚、コレクションに対してforeachを使う際は、情報取得用とし、内容の変更は行わない
でください。
コレクションの内容を変更したことによる予期せぬ動作を防ぐ為です(たとえば、リスト
コレクションのサイズをループ途中で途中で変えてしまったりした場合、まともに動く
保障はありません)
最終更新:2007年09月29日 12:57