forのコードトレース
配列から必要な値を集計し、逆順表示や二重ループの回数を確認します。forの開始値・条件・更新を変更したときにどの結果が変わるか、短いコードを実行して検証します。
この単元で学ぶこと
- 基本forの実行順と変数のスコープを説明できる
- 添字とlengthを使って配列を走査できる
- 更新の副作用と境界値を実行結果で検証できる
本文解説
要素と位置を分ける int[] p={5,7,9};で添字は0、1、2、値は5、7、9です。for(int i=0;i<p.length;i++)で使うi自体を加算すると0+1+2=3となり、値の合計21とは異なります。集計対象が位置なのか値なのかを先に決めます。
先頭を飛ばした結果 for(int i=1;i<p.length;i++)で始めると最初の5を処理せず7+9=16になります。0件・1件で試すと先頭を誤って飛ばす不具合を見つけやすくなります。一方、前の要素との比較なら1から始める理由もあるため、開始値だけで誤りとは決めません。
逆向きと境界 for(int i=p.length-1;i>0;i--)は9と7を処理し、5を除外します。全件ならi>=0が必要です。開始をp.lengthにすると最初から範囲外なので、条件に入った後で戻せばよいという考えは通りません。アクセス時点の添字を確かめます。
複数の更新 for(int i=0,j=3;i<j;i++,j--)は、開始時の組が(0,3)、次が(1,2)、その次は(2,1)でfalseです。同じint宣言の複数変数を扱えますが、二つの更新があるから本体も二回ずつ動くわけではありません。更新は記述順に評価します。
後置増分を加える int s=0; for(int i=0;i<3;){s+=i++;}は0+1+2で3になります。更新欄が空でも本体内の更新で進みます。i++を++iへ変えると足す値は1、2、3で6です。増分がある場所と式が返す値を分けて追います。
二重ループの範囲 for(int i=0;i<3;i++){for(int j=0;j<i;j++){...}}の内側回数は0、1、2で合計3です。内側上限が外側変数で変化するため、3×3とは数えません。各外側値について内側の有効範囲を列挙します。
ループ外の値 外で宣言したiをforで使えば終了後にも参照できます。一方、for内で宣言したiの代わりに集計値sumだけを外へ残す設計なら、不要なカウンターの再利用を避けられます。スコープのエラーと、値が意図と異なる論理エラーを分けます。
確認の手順 各例を独立したmainに置き、表示の文字列や合計を予測してから実行します。範囲外の例は後続処理が実行されないことも確認します。同じ変数名を使う複数例を同じmainへ連結すると重複宣言になるので、検証用ケースは分けます。
図解
重要ポイント
- 初期化は一度、条件→本体→更新を反復する。
- 添字は0以上length未満。
- for内宣言の変数は外から参照できない。
- 空文や更新位置を字下げだけで判断しない。
間違えやすい点
- 条件の<=で配列末尾を一つ超えない。
- 逆順の条件と減算を取り違えない。
- 本体前の;で意図しない空ループにしない。
用語解説
- 初期化
- forの開始時に一度行う変数宣言や代入。
- 継続条件
- 本体を実行する前に評価するboolean条件。
- 更新
- 本体の通常終了後などに実行する増分・代入等。
- スコープ
- 変数名を使えるソース上の範囲。
- 添字
- 配列の要素位置。先頭は0。
関連教材
参考資料
教材データに登録された参考リンクです。リンク先の内容や更新日は提供元でご確認ください。
確認問題の出題・採点や学習履歴の保存にはログインが必要です。