for 文の基本

生田 陸人
LuaGate エンジニア / 現役エンジニア
編集 LuaGate編集部

このレッスンで分かること

  • for (初期化; 条件; 更新) の 3 つをセミコロン ; で区切ります
  • ループ変数は慣習として i、ネストするなら j k
  • 最小例は for (int i = 1; i <= n; i++) { result += i + " "; }

for 文の基本 とは

決まった回数を繰り返したいときの相棒、for 文を学ぼう。初期化・条件・更新の 3 つの式の意味を理解する。

for 文は「決まった回数」だけ繰り返す道具

プログラムを書いていると「同じ処理を 10 回繰り返したい」「リストの先頭から最後まで順番に見たい」という場面がしょっちゅう出てきます。そのたびに System.out.println(1); System.out.println(2); ... と手で並べるのは現実的ではありません。そこで登場するのが繰り返し構文、その中でも今回は for 文を学んでいきます。

プログラミング言語にはいくつかの繰り返し構文があり、Java には主に for while do-while for-each の 4 種類があります。その中でも for 文は「5 回繰り返す」「1 から 100 まで足す」のように 回数が決まっている ループに最も向いています。慣習として、競技プログラミングでも業務コードでも、回数決め打ちのループはまず for を考える、というのが Java の文化です。

試しに、1 から 5 まで順番に表示するコードを for なしで書くとこうなります。

Java

public class Solution { public static void show() { System.out.println(1); System.out.println(2); System.out.println(3); System.out.println(4); System.out.println(5); } }

5 回ならまだ書けますが、これが 100 回、1000 回になったら破綻します。for 文を使うと、同じことをたった 3 行で書けます。

Java

public class Solution { public static void show() { for (int i = 1; i <= 5; i++) { System.out.println(i); } } }

「同じ形のことを繰り返す」をコンパクトに表現できる、これが for 文の魅力です。

for 文の文法 — 3 つの式を ; で区切る

Javafor 文の基本形は次のとおりです。

Java

for (初期化; 条件; 更新) { // 繰り返したい処理 }

丸カッコの中には、セミコロン ; で区切られた 3 つの式が並びます。それぞれの役目は次の通りです。

タイミング
初期化ループ開始前 1 回int i = 1
条件毎回ループ前に評価i <= n
更新本体実行後に評価i++

さきほどの for (int i = 1; i <= 5; i++) を 3 つに分けると、int i = 1 が初期化、i <= 5 が条件、i++ が更新です。これで i1, 2, 3, 4, 5 と進み、6 になった瞬間に i <= 5false になってループを抜けます。

3 つの式を 必ずセミコロンで区切る のが Java の for 文のお作法です。カンマで区切ったり、セミコロンを忘れたりするとコンパイルエラーになります。

ループ変数は i、ネストするときは j k

ループのカウンタとなる変数名は、慣習的に i を使います。iindex の頭文字で、これは Java だけでなく C C++ JavaScript Python など、ほぼすべての言語で共通の文化です。

  • 一重ループ — i を使う
  • 二重ループ (内側のループ) — j を使う
  • 三重ループ — k を使う

もちろん countindex のような分かりやすい名前を付けてもエラーにはなりません。ただ、for のループ変数だけは「短くて読みやすい慣習名」のほうが好まれます。for (int row = 0; ...) for (int col = 0; ...) のように 意味のある名前 を付けたい場合は、意図がはっきり伝わるならそのほうがベターです。

「読みやすい変数名がよい」と聞いて、for (int counterForLoop = 0; counterForLoop < 10; counterForLoop++) のような長い名前を付けたくなる人がいますが、for の中だけで完結する短命な変数は i で十分です。

文字列を for で連結する

今回の課題で必要になる、文字列の組み立てを for でやるパターンを見ておきましょう。1 から n までの数を空白区切りで連結する例です。

Java

public class Solution { public static String countUp(int n) { String result = ""; for (int i = 1; i <= n; i++) { result += i + " "; } return result.trim(); } }

ポイントを順に見ていきます。

  • String result = "";空の文字列 を用意する
  • result += i + " "; で「数値 + 空白」を末尾に追加していく (iint でも + " " で文字列に変換される)
  • ループが終わると result"1 2 3 4 5 " のように末尾に空白が 1 つ余分に付く
  • return result.trim(); で前後の余分な空白を取り除いて返す

もうひとつ、末尾の空白を出さないために「先頭以外で空白を入れる」というテクニックもあります。

Java

public class Solution { public static String countUp(int n) { String result = ""; for (int i = 1; i <= n; i++) { if (i > 1) { result += " "; } result += i; } return result; } }

どちらも結果は同じです。読みやすいほうを選んでかまいません。

ちなみに大量の文字列を連結するときは String ではなく StringBuilder を使うのが定石です。String は不変 (immutable) なので、+= のたびに新しい文字列が作られて非効率になります。とはいえ初学者のうちは String result = ""; result += ... で十分です。

実行フローを図で追ってみる

for の中で何が起きているのか、図で確認してみましょう。for (int i = 1; i <= 3; i++) が回るときの流れは次のとおりです。

diagram (will load when visible)

図の流れを順序リストで書き直すと、次の通りです。

  1. 初期化 int i = 1 を実行する (ループ前に 1 度)
  2. 条件 i <= 3 を評価する
  3. 真であれば本体を実行する
  4. 更新 i++ を実行する
  5. 2 に戻る
  6. 偽であればループを抜ける

「初期化は最初の 1 回だけ」「条件 → 本体 → 更新 → 条件 → ...」とぐるぐる回っていく流れがイメージできるはずです。条件が false になった瞬間にループを抜ける、というのが大事なポイントです。

よくある間違い

for 文を使い始めるとき、初心者がほぼ全員ハマる落とし穴が 3 つあります。先に知っておけば回避できます。

  • 区切り文字をカンマにしてしまうfor (int i = 0, i < 10, i++) のようにカンマで区切るのは間違いで、正しくはセミコロン ; です
  • 条件と更新を逆にして無限ループfor (int i = 0; i < 10; i--) のように更新が逆向きだと i が永遠に増えないので、ループが終わりません。chotdekiru の Java Playground では 5 秒の実行制限で強制終了されますが、本番環境では CPU を食い続けてシステムが固まります
  • ループ変数をループの外で使ってしまうfor (int i = 0; i < 10; i++)i は丸カッコ内で宣言されているので、for ブロックの外では使えません

無限ループは初心者にとっての最初の関門です。実行時間制限のある環境で練習しておくと、本番でも被害を最小限にできます。

もうひとつ、「for (int i = 0; i <= n; i++)」と「for (int i = 1; i <= n; i++)」のどちらにするか、「<<= か」で迷うことがよくあります。これは 始まりの値 で決まります。0 から始めるなら配列の添字と相性がいいので i < n (n 回回る)、1 から人間にとって自然な数で数えるなら i <= n (これも n 回回る) と覚えておくと、書きながら迷わなくて済みます。

この章のポイント

ここまでの要点 for (初期化; 条件; 更新) をセミコロンで区切る。ループ変数は i。末尾空白は trim() か「先頭以外でスペース」で処理する。

やってみよう

それでは今回の課題に取り組みましょう。やることは次の通りです。

  1. Solution.countUp(int n) メソッドの中身を埋める
  2. for 文を使って 1 から n までの数を空白区切りでつなげた文字列を作る
  3. countUp(3)"1 2 3"countUp(5)"1 2 3 4 5"countUp(1)"1" になるかを確認する

注意点として、末尾に余分な空白を残さない こと。"1 2 3 " のように最後にスペースが残るとテストが fail します。trim() で取り除く方法と、if で先頭以外のときだけ空白を足す方法、どちらでも構いません。

余裕があれば、countUp(0)countUp(-1) のような境界ケースで何が返るかも考えてみてください。今回のテストでは扱いませんが、実務では「想定外の入力で何が起きるか」を考える癖が役に立ちます。

このレッスンで for 文の骨格が分かれば、次は while 文や for-each 文、ネストしたループへと進んでいけます。手を動かして、for の 3 つの式が指のリズムに馴染むまで何回も書いてみましょう。

よくある質問

Q. for と while はどう使い分けますか?

A. 繰り返し回数や対象が決まっているなら for(リスト・range など)が読みやすく、終了条件が動的に決まるなら while を使います。例えば「100 回繰り返す」は for i in range(100):、「ユーザー入力が q になるまで」は while True + break が向いています。

Q. ループの途中で抜けたいときは?

A. break を使うとそのループを即座に終了します。次の周回に進みたいだけなら continue を使い、現在の処理だけスキップします。break / continue は読み手にとってジャンプ先が見えにくいため、関数化して return で抜けると意図が伝わりやすくなります。

Q. インデックスも一緒に取りたい場合は?

A. Python なら for i, v in enumerate(items):、JavaScript なら items.forEach((v, i) => ...) のようにインデックスを同時に取り出せます。手動で i = 0; i += 1 と書くと off-by-one のミスを誘発しやすいので、言語の標準機能を使うのが安全です。

次のレッスン

次は 1 から N までの合計 で、決まった回数を繰り返したいときの相棒、for 文を学ぼう を学びます。

事前確認 — 進む前に次の 3 つができることを確認しましょう。

  1. for の要点を自分の言葉で説明できる
  2. このレッスンの最小コード (または操作手順) を見ずに書ける
  3. 練習問題やクイズで間違えた箇所を読み直して理解した

理解度チェック (30 秒)

Q. for とは何か、1 文で説明してください。

この章のポイント

A. 本文の「このレッスンで分かること」または冒頭の説明文を見直し、自分の言葉で要約できれば OK。詰まったら本レッスンの最初の H2 セクションを読み返してみましょう。

関連レッスン

要件

  1. クラス名は Solution、メソッド名は countUp、引数は int n 1 つ、戻り値の型は String
  2. 繰り返し処理には必ず for 文を使うこと (while や再帰ではなく)
  3. 末尾に余分な空白を入れないこと ("1 2 3" であり "1 2 3 " ではない)

入出力例

test-cases.txt

countUp(3)"1 2 3" countUp(5)"1 2 3 4 5" countUp(1)"1"

ヒント

main.java
main.java
学習モード

メモ

for 文の基本

⌘S で保存