繰り返し処理(ループ)とは
プログラミングにおいて、同じ、あるいはよく似た処理を特定の回数や条件が満たされるまで何度も実行したい場合があります。このような処理を「繰り返し処理」または「ループ」と呼びます。
C#には、この繰り返し処理を実現するために、主に3つの構文が用意されています。
forループwhileループdo-whileループ
これらは似ていますが、それぞれ得意とする場面が異なります。この記事では、各ループ構文の基本的な使い方と、どのような状況で使い分けるべきかを解説します。
for ループ (繰り返し回数が明確な場合)
forループは、繰り返す回数があらかじめ決まっている場合に最も適した構文です。
for文は「初期化」「条件式」「変化式」の3つの部分で構成され、指定した回数だけ処理ブロックを実行します。
- 初期化: ループの開始前に一度だけ実行されます(通常、カウンター変数を初期化します)。
- 条件式: ループ処理の実行前に評価されます。
trueであれば処理が実行され、falseになるとループが終了します。 - 変化式: ループ処理が1回終わるごとに実行されます(通常、カウンター変数を増減させます)。
for ループのコード例
例えば、ショッピングカート(リスト)に入っている複数の商品の合計金額を計算する場合、forループはリストの要素数だけ繰り返す処理として最適です。
using System;
using System.Collections.Generic;
public class ForLoopExample
{
public static void Main()
{
// カート内の商品価格リスト
var productPrices = new List<int> { 1200, 850, 2000, 500 };
int totalAmount = 0;
// 'for' ループを使用して、リストの要素数だけ繰り返す
// i は 0 から始まり、productPrices.Count (4) より小さい間、1ずつ増える
for (int i = 0; i < productPrices.Count; i++)
{
totalAmount += productPrices[i];
Console.WriteLine($"Item {i + 1} の価格: {productPrices[i]}円");
}
Console.WriteLine($"---");
Console.WriteLine($"合計金額: {totalAmount}円");
}
}
出力結果:
Item 1 の価格: 1200円
Item 2 の価格: 850円
Item 3 の価格: 2000円
Item 4 の価格: 500円
---
合計金額: 4550円
while ループ (条件が真の間繰り返す)
whileループは、繰り返す回数が明確ではなく、特定の条件が満たされている(true)間だけ処理を続けたい場合に使用します。
while文は、ループ処理の実行前に条件式を評価します(前判定)。
もし、ループ開始時点で条件式がfalseであった場合、whileブロック内の処理は一度も実行されません。
while ループのコード例
例えば、シミュレーションなどで「特定の状態になるまで」処理を繰り返す場合に適しています。ここでは、貯水タンクの水量が目標値に達するまで水を追加し続ける処理をシミュレートします。
using System;
public class WhileLoopExample
{
public static void Main()
{
double currentWaterLevel = 0.0; // 現在の水量 (L)
const double targetWaterLevel = 50.0; // 目標の水量 (L)
const double waterPerCycle = 7.5; // 1サイクルで追加する水量
Console.WriteLine($"目標水量 {targetWaterLevel}L まで水を追加します。");
// 'while' ループ: 現在の水量が目標に達するまで繰り返す
while (currentWaterLevel < targetWaterLevel)
{
currentWaterLevel += waterPerCycle;
Console.WriteLine($"水を追加しました。現在: {currentWaterLevel:F1}L");
// 意図しない無限ループを防ぐための安全装置(ここでは不要だが、実用上は考慮する)
if (currentWaterLevel > targetWaterLevel + 100) break;
}
Console.WriteLine($"---");
Console.WriteLine("目標水量に達しました。処理を終了します。");
}
}
出力結果:
目標水量 50.0L まで水を追加します。
水を追加しました。現在: 7.5L
水を追加しました。現在: 15.0L
水を追加しました。現在: 22.5L
水を追加しました。現在: 30.0L
水を追加しました。現在: 37.5L
水を追加しました。現在: 45.0L
水を追加しました。現在: 52.5L
---
目標水量に達しました。処理を終了します。
do-while ループ (最低1回は実行する)
do-whileループもwhileループと同様に、条件が満たされている間繰り返しますが、条件式の評価を処理の実行後に行う(後判定)という決定的な違いがあります。
この特性により、do-whileブロック内の処理は、条件式の結果に関わらず、必ず最低1回は実行されます。
do-while ループのコード例
do-whileループが最も活躍する場面は、「まず処理を実行し、その結果次第で繰り返すかどうかを決めたい」場合です。典型的な例が、ユーザーからの入力検証です。
using System;
public class DoWhileExample
{
public static void Main()
{
string userInput;
const string exitCommand = "exit";
// 'do-while' ループ: ユーザーが "exit" と入力するまで処理を繰り返す
do
{
// この処理は最低1回は実行される
Console.Write("コマンドを入力してください (終了する場合は 'exit' と入力): ");
userInput = Console.ReadLine() ?? ""; // ?? "" は null 対策
if (userInput != exitCommand)
{
Console.WriteLine($"エコー: {userInput}");
}
}
while (userInput != exitCommand); // 処理の最後に条件を判定
Console.WriteLine("---");
Console.WriteLine("プログラムを終了します。");
}
}
実行例:
コマンドを入力してください (終了する場合は 'exit' と入力): hello
エコー: hello
コマンドを入力してください (終了する場合は 'exit' と入力): test
エコー: test
コマンドを入力してください (終了する場合は 'exit' と入力): exit
---
プログラムを終了します。
使い分けのまとめ
3つのループ構文の使い分けは、コードの意図を明確にする上で非常に重要です。
forループ:- 使う場面: 繰り返しの回数が最初から決まっている。(例: リストの全要素処理、1から10まで数える)
whileループ:- 使う場面: 条件次第で繰り返すか決める。0回の実行もあり得る。(例: 状態の監視、ファイルの終端まで読み込む)
do-whileループ:- 使う場面: 最低1回は処理を実行し、その結果で継続を判断する。(例: ユーザーの入力検証、メニュー表示)
どのループ処理も、条件式を誤ると「無限ループ」に陥る可能性があるため、ループが必ず終了する条件を正しく設定することが重要です。
