forの使い方について
この項目で学ぶこと
forの使い方
プログラムを作成していると、同じよう処理を繰り返すことがよくあります。そのような処理を効率よく行うための制御文のひとつにforがあります。機能が多いのでしっかり覚えましょう。まずサンプルソースを見てみましょう。「変数++」は変数の値を+1する演算子です。
変数の値を5回表示する
#include<stdio.h> int main (){ int i; // カウンタは慣例的に「i」を用いる for( i=0 ; i<5 ; i++ ){ // 初期設定式;条件式;再設定式 printf("iの値は%d\n",i); } return 0; }
これの実行結果は
iの値は0 iの値は1 : iの値は4
と表示されます。for文は一般に以下のような形をしています。
for( 初期設定式 ; 条件式 ; 再設定式 ){ ここの処理を繰り返す }
初期設定式とは、for文が実行されるとき、一番はじめに一度だけ実行される式です。
条件式を満たさないとき(偽のとき)ループ処理が終了します。
{}(ブロック)の最後まで来たとき、再設定式が実行されます。
ややこしいですね。順番に動作を見てみましょう。
1.初期設定式を実行する
2.条件式を計算する 真なら3へ 偽ならループ終了
3.ブロック内の処理を実行する
4.再設定式を実行する → 2へ
はじめのうちは「これ5回実行されんの?それとも6回実行されんの?」と、戸惑うかもしれません。そのうち慣れます。定められた回数をループするとき、特別な理由がなければカウンタを0から始めてください。これは後の項目で習う配列を意識しているためです。
条件式を満たさないとき(偽のとき)ループ処理が終了します。
{}(ブロック)の最後まで来たとき、再設定式が実行されます。
ややこしいですね。順番に動作を見てみましょう。
1.初期設定式を実行する
2.条件式を計算する 真なら3へ 偽ならループ終了
3.ブロック内の処理を実行する
4.再設定式を実行する → 2へ
はじめのうちは「これ5回実行されんの?それとも6回実行されんの?」と、戸惑うかもしれません。そのうち慣れます。定められた回数をループするとき、特別な理由がなければカウンタを0から始めてください。これは後の項目で習う配列を意識しているためです。
こんなかんじ
int i; //5回実行したいとき for( i=0 ; i<5 ; i++) // 10回実行したいとき for( i=0 ; i<10 ; i++ )
break文の使い方
switch文で登場したbreak文と機能はほとんど一緒です。ループ中にbreakを実行するとそのループから抜けます。普通、if文によって特定の条件を満たしたときにbreakするようにして使います。
( )内の省略
forの直後の( )内は、それぞれ省略することが出来ます。ただし、セミコロンを省略することはできません。条件式を省略した場合、break文を使用しないかぎりループを終えることが出来ません。これを無限ループといいます。全てを省略したソースを紹介します。
#include<stdio.h> int main (){ int i; i=0; for( ; ; ){ printf("iの値は%d\n",i); i++; if( i>3 ) // iが3より大きいなら break; // ループを抜ける } return 0; }
二重ループ
ループの中にループを書くことが出来ます。これを二重ループといいます。慣れるまでは動作が分かりにくいかもしれません。サンプルソースと実行結果を見てみましょう。
二重ループをして、実行された順番を見るためのプログラム
#include<stdio.h> int main (){ int i,j; for( i=0 ; i<3 ; i++ ){ printf("外側のループの%d週目です\n",i+1); for( j=0 ; j<2 ; j++ ){ printf("\t内側のループの%d週目です\n",j+1); } } return 0; }
実行結果
外側のループの1週目です 内側のループの1週目です 内側のループの2週目です 外側のループの2週目です 内側のループの1週目です 内側のループの2週目です 外側のループの3週目です 内側のループの1週目です 内側のループの2週目です
printf関数内で使用している¥tはキーボードのTabキーの役割をします。字下げですね。
さて、内側のループで特定の条件を満たしたときに、2重ループをbreak文を使って抜けたいとします。どうすればいいでしょうか。何も考えないでその場でbreakしたソ-スを紹介します。
さて、内側のループで特定の条件を満たしたときに、2重ループをbreak文を使って抜けたいとします。どうすればいいでしょうか。何も考えないでその場でbreakしたソ-スを紹介します。
1週目で j==1 の条件を満たしてループ全体を抜けたかったのに、失敗した例
#include<stdio.h> int main (){ int i,j; for( i=0 ; i<3 ; i++ ){ printf("外側のループの%d週目です\n",i+1); for( j=0 ; j<2 ; j++ ){ if( j==1 ) break; printf("\t内側のループの%d週目です\n",j+1); } } return 0; }
実行結果
外側のループの1週目です 内側のループの1週目です 外側のループの2週目です 内側のループの1週目です 外側のループの3週目です 内側のループの1週目です
最初のbreak文のあと、再び外側のループに拾われてしまいうまく抜けることが出来ませんでした。解決するにはループを抜けるためのフラグを用いるとうまくいきます。
#include<stdio.h> int main (){ int i,j; int BreakFlag = 0; // 0はフラグが立っていないことを示す for( i=0 ; i<3 ; i++ ){ printf("外側のループの%d週目です\n",i+1); for( j=0 ; j<2 ; j++ ){ if( j==1 ){ // 条件を満たしたら BreakFlag = 1; // フラグを立てる break; // 内側のループを抜ける } printf("\t内側のループの%d週目です\n",j+1); } if( BreakFlag ==1 ) // フラグが立っていたら外側のループを抜ける break; } return 0; }
実行結果
外側のループの1週目です 内側のループの1週目です
うまくいきましたね。フラグを用いた分岐はゲームを作る際に重要になります。フラグの値は1を立っている状態とする必要はありませんが、一般的に偽と真に対応する0と1かで管理することが多いようです。