for文とは?
for文は、C++における「繰り返し文(イテレーション文)」の一つです。while文やdo-while文と同様にループ処理を行いますが、特に**「決まった回数」や「特定の範囲」を反復する処理**を記述するのに適しています。
for文の最大の特徴は、ループを制御するために必要な3つの要素「①初期化」「②条件式」「③更新処理」を、構文の () 内にコンパクトにまとめて記述できる点です。
for文の基本構文
for文は以下の3つの部分から構成されます。
for (初期化文; 条件式; 更新処理) {
// ループ本体:条件式が true の間、実行される処理
}
1. 初期化文
ループが開始される前に、一度だけ実行されます。 通常、ループの回数を数えるための「カウンタ変数」をここで宣言し、初期化します(例: int i = 0;)。
2. 条件式
ループ本体の処理を実行する前に評価されます(while文と同じ「前判定」です)。 この式がtrueであればループ本体が実行され、falseであればfor文全体が終了します。
3. 更新処理
ループ本体の処理が1回実行されるたびに(ブロック{}の最後が実行された後に)評価されます。 通常、カウンタ変数を増減させる処理を記述します(例: i++ , i-- , i += 2)。
サンプルコード:指定回数メッセージを表示する
指定された回数だけ、コンソールにメッセージを出力するプログラムです。
#include <iostream>
#include <limits> // 入力検証用
int main() {
int displayCount;
// do-whileで入力検証 (0以上の整数)
do {
std::cout << "メッセージを何回表示しますか? (0以上の整数): ";
if (!(std::cin >> displayCount)) {
std::cout << "エラー: 数値を入力してください。\n";
std::cin.clear(); // エラーフラグをクリア
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); // バッファをクリア
displayCount = -1; // ループ継続のため、わざと不正な値にする
} else if (displayCount < 0) {
std::cout << "エラー: 0以上の整数を入力してください。\n";
}
} while (displayCount < 0);
// displayCount が 0 の場合はループ条件が最初から false になる
if (displayCount > 0) {
std::cout << "--- 表示開始 ---\n";
}
// for文の実行
// 1. i を 0 で初期化
// 2. i < displayCount を評価
// 3. (trueなら) ループ本体を実行
// 4. i++ (更新処理) を実行
// 5. 2.に戻る
for (int i = 0; i < displayCount; i++) {
// (i + 1) で 1 から始まる回数を表示
std::cout << (i + 1) << "回目のメッセージです。\n";
}
if (displayCount > 0) {
std::cout << "--- 表示終了 ---\n";
} else {
std::cout << "表示回数が0のため、何も表示しませんでした。\n";
}
return 0;
}
for初期化文と変数のスコープ
for文の「初期化文」で宣言された変数は、そのfor文の内部でのみ有効です。これを「変数のスコープ(有効範囲)がfor文に限定される」と言います。
for (int i = 0; i < 5; i++) {
// OK: i はこの { } の中で有効
std::cout << i << std::endl;
}
// NG: for文を抜けた後では i は存在しない
// std::cout << i; // ここでコンパイルエラーになる
このようにスコープが限定されることにより、変数の影響範囲が明確になり、プログラムの他の場所で誤って同じ変数名を使ってしまうといったバグを防ぎやすくなります。
注意点:セミコロンの誤用(空文)
for文の () の直後に誤ってセミコロン(;)を記述すると、意図しない動作を引き起こします。
// 悪い例
for (int i = 0; i < 10; i++); // <-- このセミコロンが問題
{
// このブロックは for ループの一部ではない
std::cout << "このメッセージは1回だけ表示されます。\n";
}
C++では、セミコロン単体(;)は「何も処理をしない」という「空文(からぶん)」として扱われます。 上記の悪い例では、for文は「何も処理をしない(空文)」という動作を10回繰り返し、そのループが完全に終了した後に、後続の {} ブロックが1回だけ実行されます。
これはwhile文でも同様に発生しうる、よくある間違いの一つです。
C++11以降:範囲ベースforループ
最新のC++(C++11以降)では、伝統的なfor文に加えて、「範囲ベースforループ(Range-based for loop)」が導入されました。
これは、std::vectorや配列のような「コンテナ」の全要素に対して、先頭から順に処理を行う場合に非常に便利で、コードを大幅に簡潔にできます。
#include <iostream>
#include <vector>
#include <string>
int main() {
std::vector<std::string> taskList = {"設計", "実装", "テスト", "リリース"};
std::cout << "本日のタスクリスト:\n";
// C++11 範囲ベースforループ
// taskList から要素を1つずつ取り出し、task 変数に入れる
for (const auto& task : taskList) {
std::cout << "- " << task << "\n";
}
return 0;
}
実行結果:
本日のタスクリスト:
- 設計
- 実装
- テスト
- リリース
インデックス(i)を管理する必要がなく、非常に読みやすくなります。
まとめ
for文は、C++の繰り返し処理において中心的な役割を果たします。
- 「初期化」「条件式」「更新処理」を1行で管理できるため、特に回数が決まったループに適しています。
for文で宣言された変数のスコープは、そのループ内に限定されます。- 最新のC++では、コンテナの全要素を処理するための「範囲ベース
for文」も強力な選択肢となります。
