forを理解する
forは初期化、継続条件、更新を一か所に書く繰返しです。読み方は左から一度ずつではなく、初期化の後に条件・本体・更新を繰り返します。各コードは正しいmain内で実行するものとして、表示と終了後の値を追跡します。
この単元で学ぶこと
- 基本forの実行順と変数のスコープを説明できる
- 添字とlengthを使って配列を走査できる
- 更新の副作用と境界値を実行結果で検証できる
本文解説
三つの部分 for(int i=0;i<3;i++){System.out.print(i);}では、int i=0を最初に一度実行します。i<3が真なら本体を実行し、その後i++を行って条件へ戻ります。表示は012です。更新は本体より前ではなく後であり、条件を最初に満たさなければ本体も更新も実行しません。
実行順を表にする 最初はi=0、条件true、表示0、更新で1。次は1、true、表示1、更新で2。次は2、true、表示2、更新で3。最後は3、falseで終了です。最後の表示値と最後の条件評価値は異なります。更新欄に副作用があれば、その順序まで含めて記録します。
変数の使える範囲 for(int i=0;i<3;i++)のiはループ内で有効ですが、ループの後にSystem.out.print(i);と書くと参照できません。int i; for(i=0;i<3;i++){}なら外で宣言したiなので終了後に3を読めます。変数の生存範囲は初期値や実行回数とは別に確認します。
配列と境界 int[] a={2,4,6}; for(int i=0;i<a.length;i++){System.out.print(a[i]);}は246です。有効な添字は0からlength-1までなので、<=a.lengthでは最後に範囲外になります。長さ0の配列ならi<0が最初からfalseで、要素へのアクセスを一度も行いません。
合計と逆順 int sum=0; for(int i=0;i<a.length;i++){sum+=a[i];}の結果は12です。逆順ならfor(int i=a.length-1;i>=0;i--){...}とします。開始値、条件の向き、増減の三点をそろえます。逆順なのにi++を使うと範囲外や終了しない原因になります。
更新と省略 for(int i=0;i<5;i+=2)は0、2、4を処理します。条件欄を省略したfor(;;)は条件falseで終わる道がないので、通常はbreak等の終了経路が必要です。三つの欄を省略できても区切りのセミコロン二つは必要です。無限の例は不用意に実行せず、終了経路を先に確認します。
空文と二重ループ for(int i=0;i<3;i++); System.out.print("X");では本体が空文なのでXの表示はループ後の一回です。二重forなら内側全体が外側の本体になります。外側2回・内側3回なら内側本体は6回ですが、途中のbreakや条件変化があれば掛け算だけでは決められません。
検証する値 短い配列と0・1・複数件のケースを用意し、各回の添字、取得値、集計値を表示します。コンパイル時のスコープエラーと、実行時の範囲外例外を別に検証します。printlnで改行する場合とprintで連結する場合も、期待する出力形式に合わせます。
図解
重要ポイント
- 初期化は一度、条件→本体→更新を反復する。
- 添字は0以上length未満。
- for内宣言の変数は外から参照できない。
- 空文や更新位置を字下げだけで判断しない。
間違えやすい点
- 条件の<=で配列末尾を一つ超えない。
- 逆順の条件と減算を取り違えない。
- 本体前の;で意図しない空ループにしない。
用語解説
- 初期化
- forの開始時に一度行う変数宣言や代入。
- 継続条件
- 本体を実行する前に評価するboolean条件。
- 更新
- 本体の通常終了後などに実行する増分・代入等。
- スコープ
- 変数名を使えるソース上の範囲。
- 添字
- 配列の要素位置。先頭は0。
関連教材
参考資料
教材データに登録された参考リンクです。リンク先の内容や更新日は提供元でご確認ください。
確認問題の出題・採点や学習履歴の保存にはログインが必要です。