配列の添字とlengthのコードトレース

配列のlengthは要素数を表し、添字はその中の位置を指定します。0からlength-1までという境界を基準に、範囲外・null・型不一致を区別し、安全なループと末尾参照を組み立てます。

この単元で学ぶこと

  • lengthから有効添字の範囲を求める
  • 配列参照時の例外とコンパイルエラーを区別する
  • 境界条件を守るループを追う

本文解説

境界を表で整理する 長さ3なら-1は下側範囲外、0は先頭、2は末尾、3は上側範囲外です。式で添字を作る問題は、その式の値を先に求めて表へ当てはめます。a[a.length/2]なら3/2=1で中央要素です。

末尾を省くループ i<a.length-1は最後の添字より小さいところまでなので、末尾要素を処理しません。隣接するa[i+1]も同時に参照する処理なら、この上限が必要な場合があります。式だけで誤りと決めず、ループ本体がどの添字を使うかも確認します。

隣同士の比較 for(int i=0;i<a.length-1;i++){if(a[i]<a[i+1])count++;}は隣接ペアを調べます。長さnが1以上ならn-1組、空配列なら0組です。i<a.lengthに変えると最後にa[length]を参照して例外になるので、対象ペアの範囲から条件を決めます。

後置増分の添字 int i=0;int x=a[i++];は添字0の値を取り出してiを1へ更新します。a[++i]なら先に1へ増やして添字1を使います。配列アクセス自体が後の評価順へ影響する場合もあるため、添字式の値と変数の最終値を別に書きます。

代入左辺の添字の保存 a[i++]=i;は左辺の添字を先に評価してiを増やし、右辺は更新後のiを読みます。i=0ならa[0]に1を格納します。a[i]=i++なら先に添字0を選び、右辺の式の値0を格納してiは1です。

null検査と長さ検査 a!=null&&a.length>0&&a[0]>0の順なら実体と要素が存在するときだけ先頭を読みます。条件を逆にしてa[0]>0を先に置くと、後ろの検査に到達する前に例外になります。&&は右の式を評価する前提を左に置くために使えます。

コピー先の長さ 異なる長さの配列へ同じ添字でコピーする場合、読取り側と書込み側の両方の範囲を満たす必要があります。短い配列へ長い配列の全要素を入れれば書込み側で範囲外です。保存先を十分な長さにするか、意図したコピー範囲を明示します。

長さ1と空配列 長さ1ならa.length-1は0で先頭と末尾が同じです。空配列の逆順ループをi=-1からi>=0で判定すれば0回となり安全です。ループ開始前にa[-1]を読み取らない限り、計算結果が負でもその値を添字として使わなければ例外にはなりません。

図解

長さ3の境界
長さ0の場合は有効な添字が一つもない。

重要ポイント

  • lengthはメソッドでなくfinalのフィールド。
  • 添字は0以上かつlength未満。
  • 負の添字やlengthと等しい添字は実行時例外。
  • long添字は値が小さくても直接使えない。

間違えやすい点

  • length()とlengthを混同しない。
  • i<=a.lengthを全要素走査に使わない。
  • 空配列でa[a.length-1]を無条件に参照しない。

用語解説

length
配列実体の要素数を返すint型のfinalフィールド。
範囲外添字
0未満またはlength以上の添字。
境界検査
要素アクセス時に添字が有効範囲かを確認する実行時検査。

関連教材

参考資料

教材データに登録された参考リンクです。リンク先の内容や更新日は提供元でご確認ください。

確認問題の出題・採点や学習履歴の保存にはログインが必要です。