C# の if ステートメントとループ - 条件ロジックのチュートリアル

このチュートリアルでは、変数を調べ、その変数に基づいて実行パスを変更する C# コードを記述する方法について説明します。 C# コードを記述し、コードをコンパイルおよび実行して結果を確認します。 チュートリアルには、C# における分岐構造とループ構造を確認する一連のレッスンが含まれています。 これらのレッスンでは、C# 言語の基本を説明します。

ヒント

フォーカス モード内にコード スニペットを貼り付けるには、キーボード ショートカット (Ctrl + v、または cmd + v) を使用する必要があります。

前提条件

このチュートリアルでは、ローカル開発用にセットアップされたコンピューターがあることを想定しています。 インストール手順と .NET でのアプリケーション開発の概要については、「ローカル環境をセットアップする」を参照してください。

ローカル環境のセットアップをスキップしてコードを実行したい場合は、このチュートリアルの対話型 (ブラウザー内) バージョンを参照してください。

if ステートメントを使用した条件判定

branches-tutorial」という名前のディレクトリを作成します。 それを現在のディレクトリにして、次のコマンドを実行します。

dotnet new console -n BranchesAndLoops -o .

重要

.NET 6 の C# テンプレートでは "最上位レベルのステートメント" が使用されます。 .NET 6 に既にアップグレードしている場合、お使いのアプリケーションはこの記事のコードに一致しないかもしれません。 詳細については、「新しい C# テンプレートで、最上位レベルのステートメントが生成される」の記事を参照してください。

.NET 6 SDK により、次の SDK を使用するプロジェクトに対して "暗黙的な" ディレクティブ セットも追加されます。

  • Microsoft.NET.Sdk
  • Microsoft.NET.Sdk.Web
  • Microsoft.NET.Sdk.Worker

これらの暗黙的な global using ディレクティブには、プロジェクトの種類に応じて最も一般的な名前空間が含まれます。

詳細については、「暗黙的な using ディレクティブ」の記事を参照してください

このコマンドにより、現在のディレクトリに新しい .NET コンソール アプリケーションが作成されます。 好みのエディターで Program.cs を開き、内容を次のコードで置き換えます。

int a = 5;
int b = 6;
if (a + b > 10)
    Console.WriteLine("The answer is greater than 10.");

コンソール ウィンドウで「dotnet run」と入力し、このコードを試します。 "答えは 10 を超えています" というメッセージがコンソールに出力されるはずです。 合計が 10 未満になるように b の宣言を変更します。

int b = 3;

もう一度「dotnet run」を入力します。 計算結果が 10 未満であるため、何も出力されません。 判定中の条件が false になっています。 if ステートメントの考えられる分岐の 1 つである true 分岐のみを記述したため、実行すべきコードがありません。

ヒント

C# (または何らかのプログラミング言語) について詳しく学習するに従い、コードを記述する際にミスをすることもあるでしょう。 コンパイラは、エラーを発見して報告します。 エラーの出力とそのエラーを生成したコードをよく確認してください。 通常、コンパイラ エラーは問題を発見するのに役立ちます。

この最初のサンプルは、if とブール型の機能を示しています。 ブール値は、true または false という 2 つの値のいずれかを持つことができる変数です。 C# ではブール変数の専用の型として bool を定義しています。 if ステートメントは、bool の値を確認します。 値が true の場合、if に続くステートメントを実行します。 それ以外の場合はスキップします。 条件を確認してその条件に基づいてステートメントを実行するというこのプロセスは機能的です。

if と else を組み合わせた使用

true 分岐と false 分岐で別々のコードを実行するには、条件が false のときに実行する else 分岐を作成します。 else 分岐を試してみてください。 次のコードの最後の 2 行を追加します (最初の 4 行は既にあるはずです)。

int a = 5;
int b = 3;
if (a + b > 10)
    Console.WriteLine("The answer is greater than 10");
else
    Console.WriteLine("The answer is not greater than 10");

else キーワードに続くステートメントは、判定中の条件が false のときにのみ実行されます。 ifelse をブール条件と組み合わせれば、truefalse の条件を両方処理するのに必要な機能がすべて整います。

重要

ifelse のステートメント内にあるインデントは、人が読みやすいようにするためのものです。 C# 言語はインデントや空白文字を重要なものとして扱いません。 ifelse のキーワードに続くステートメントは、条件に基づいて実行されます。 このチュートリアルのすべてのサンプルでは、一般的な記述方法に従い、ステートメントの制御フローに基づいて行にインデントを挿入しています。

インデントは重要ではないため、条件に基づいて実行するブロック内に 1 つ以上のステートメントがある場合には、{} を使用して示します。 通常、C# プログラマーは ifelse の句にはこの中かっこを使用します。 次の例は、作成したものと同じ内容です。 上のコードを、次のコードに一致するように変更します。

int a = 5;
int b = 3;
if (a + b > 10)
{
    Console.WriteLine("The answer is greater than 10");
}
else
{
    Console.WriteLine("The answer is not greater than 10");
}

ヒント

このチュートリアルの残りの箇所では、一般に認められている記述方法に従って、すべてのコード サンプルで中かっこを使用しています。

さらに複雑な条件を判定できます。 これまでに記述したコードの後に、次のコードを追加します。

int c = 4;
if ((a + b + c > 10) && (a == b))
{
    Console.WriteLine("The answer is greater than 10");
    Console.WriteLine("And the first number is equal to the second");
}
else
{
    Console.WriteLine("The answer is not greater than 10");
    Console.WriteLine("Or the first number is not equal to the second");
}

== シンボルは、"同等性" をテストします。 == を使用すると、同等性のテストが a = 5 で確認した割り当てと区別されます。

&& は "and" (および) を表します。 これは、true 分岐でステートメントを実行するには、両方の条件が true になる必要があることを意味しています。 また、これらの例では、ステートメントが {} で囲まれていれば、各条件分岐に複数のステートメントを持つことができることを示しています。 || を使用して "or" (または) を表すこともできます。 これまでに記述したコードの下に、次のコードを追加します。

if ((a + b + c > 10) || (a == b))
{
    Console.WriteLine("The answer is greater than 10");
    Console.WriteLine("Or the first number is equal to the second");
}
else
{
    Console.WriteLine("The answer is not greater than 10");
    Console.WriteLine("And the first number is not equal to the second");
}

ab、および cの値を変更し、探索する &&|| を切り替えます。 && 演算子と || 演算子がどのように機能するかをより深く理解できます。

最初の手順が完了しました。 次のセクションを開始する前に、現在のコードを別のメソッドに移動してみましょう。 移動しておくと、新しい例で作業を開始するときに楽になります。 ExploreIf() というメソッドに既存のコードを入れます。 それをプログラムの先頭で呼び出します。 それらの変更を終えると、コードは次のようになるはずです。

ExploreIf();

void ExploreIf()
{
    int a = 5;
    int b = 3;
    if (a + b > 10)
    {
        Console.WriteLine("The answer is greater than 10");
    }
    else
    {
        Console.WriteLine("The answer is not greater than 10");
    }

    int c = 4;
    if ((a + b + c > 10) && (a > b))
    {
        Console.WriteLine("The answer is greater than 10");
        Console.WriteLine("And the first number is greater than the second");
    }
    else
    {
        Console.WriteLine("The answer is not greater than 10");
        Console.WriteLine("Or the first number is not greater than the second");
    }

    if ((a + b + c > 10) || (a > b))
    {
        Console.WriteLine("The answer is greater than 10");
        Console.WriteLine("Or the first number is greater than the second");
    }
    else
    {
        Console.WriteLine("The answer is not greater than 10");
        Console.WriteLine("And the first number is not greater than the second");
    }
}

ExploreIf() の呼び出しをコメント アウトします。 こうしておくと、このセクションの作業を進めるにあたって出力がすっきりします。

//ExploreIf();

C# では、// の後ろが//になります。 コードとしては実行せずにソース コード内に残したい任意のテキストを、コメントにすることができます。 コンパイラは、コメントから実行可能コードを生成しません。

ループを使用した処理の繰り返し

このセクションではループを使用してステートメントを繰り返し実行します。 ExploreIf の呼び出しの後に、次のコードを追加します。

int counter = 0;
while (counter < 10)
{
    Console.WriteLine($"Hello World! The counter is {counter}");
    counter++;
}

while ステートメントは、条件を確認して while に続くステートメントまたはステートメント ブロックを実行します。 条件が false になるまで、条件の確認とステートメントの実行を繰り返します。

この例では、もう 1 つ新しい演算子が使用されています。 counter 変数のあとにある ++ は、インクリメント演算子です。 counter の値に 1 を足し、その値を counter 変数に格納します。

重要

コードを実行したときに while のループ条件が false に切り替わることを確認してください。 それ以外の場合は、プログラムが終了することのない無限ループを作成します。 CTRL-C またはその他の方法でプログラムを強制的に終了する必要があるため、このサンプルでは実践しません。

while ループは、条件を判定してから while に続くコードを実行します。 do ... while ループは、最初にコードを実行してからその条件を確認します。 do while ループを次のコードで示します。

int counter = 0;
do
{
    Console.WriteLine($"Hello World! The counter is {counter}");
    counter++;
} while (counter < 10);

この do ループと先述の while ループの出力は同じ結果になります。

for ループの処理

C# では for ループがよく使用されます。 次のコードを試してみましょう。

for (int index = 0; index < 10; index++)
{
    Console.WriteLine($"Hello World! The index is {index}");
}

前のコードは、既に使用した while ループや do ループと同じ機能を持っています。 for ステートメントは 3 つの部分に分かれてその機能を制御します。

最初の部分は、for 初期化子です。int index = 0; は、index がループ変数であることを宣言し、その初期値を 0 に設定しています。

2 つ目の部分は、for 条件です。index < 10 は、counter の値が 10 未満である間は for ループが実行され続けることを宣言しています。

最後の部分は、for 反復子です。index++ は、for ステートメントに続くブロックを実行したあとにループ変数を変更する方法を指定しています。 ここでは、ブロックが実行されるごとに index が 1 ずつ増加するよう指定しています。

自分で試してみてください。 次のバリエーションをそれぞれ試してみます。

  • 初期化子を変更して別の値で開始する。
  • 条件を変更して別の値で停止する。

完了したら次に進み、学習したことを使用して自分でいくつかのコードを記述してみましょう。

このチュートリアルでは説明していないループ ステートメントが1つあります。foreach ステートメントです。 foreach ステートメントは、一連の項目内のすべての項目に対してステートメントを繰り返します。 これは、"コレクション" で最もよく使用されます。次のチュートリアルで説明します。

入れ子になったループの作成

whiledo、または for ループを別のループ内に入れ子にして、外側のループの各項目を内側のループの各項目と組み合わせて使用してマトリックスを作成することができます。 行と列を表す一連の英数字ペアを作成してみましょう。

1 つの for ループで行を生成できます。

for (int row = 1; row < 11; row++)
{
    Console.WriteLine($"The row is {row}");
}

別のループで列を生成できます。

for (char column = 'a'; column < 'k'; column++)
{
    Console.WriteLine($"The column is {column}");
}

一方のループをもう一方のループ内に入れ子にして、ペアを形成することができます。

for (int row = 1; row < 11; row++)
{
    for (char column = 'a'; column < 'k'; column++)
    {
        Console.WriteLine($"The cell is ({row}, {column})");
    }
}

外側のループは、内側のループが完全に実行されるたびに 1 回インクリメントされることがわかります。 行と列の入れ子を逆にし、自分で変更を確認します。 終わったら、このセクションのコードを ExploreLoops() というメソッドに入れます。

分岐とループの組み合わせ

C# 言語における if ステートメントとループ構造を見てきました。では、1 から 20 の整数のうち 3 で割り切れる数の合計を求める C# コードを記述できるか確認してみましょう。 次にいくつかヒントを示します。

  • % 演算子は、除算演算の剰余を算出します。
  • if ステートメントは、数を合計に入れるべきかどうか確認する条件を作ります。
  • for ループは、1 から 20 までのすべての数を 1 つずつ確認する一連の手順を繰り返すのに役立ちます。

ご自身で試してみてください。 そして自分がとった方法を確認してください。 答えは 63 になるはずです。 GitHub で完成版のコードを表示すると、考えられる答えの 1 つを確認できます。

これで "分岐とループ" に関するチュートリアルは終了です。

続けて独自の開発環境で配列とコレクションのチュートリアルに進むことができます。

次の記事でこれらの概念の詳細を学習できます。