【ソースコード有】C#におけるif文の書き方を具体例で解説
今回は、C#で条件分岐を記述する際に使用する「if文」について取り上げます。サンプルコードで具体的な書き方を説明していくので、ぜひ参考にしてください。
今回は、C#で条件分岐を記述する際に使用する「if文」について取り上げます。サンプルコードで具体的な書き方を説明していくので、ぜひ参考にしてください。
スキルアップ
2023/01/26 UP
- SE資格・スキル
- プログラミング
- システムエンジニア
プログラム中で、条件を指定して処理の流れを枝分かれさせる手法を「条件分岐」といいます。一定の処理を繰り返す「ループ」と併せて、条件分岐はプログラミングに欠かせない要素です。
そこで今回は、C#で条件分岐を記述する際に使用する「if文」について取り上げます。サンプルコードで具体的な書き方を説明していくので、ぜひ参考にしてください。
なお、次の記事ではループを記述する際に使用する「foreach文」について解説しています。
【ソースコード有】C#のforeachの使い方は?配列での使用方法を解説
さまざまなプログラミング言語で使えるif文とは
if文は、C#に限らずさまざまなプログラミング言語に採用されている基本的な構文の一つです。例えば、C言語やJavaでもif文を使えます。
・C言語のif文についてはこちら
・Javaのif文についてはこちら
ある条件が成立した場合にのみ一定の処理を実行するのが、if文の基本的な動作です。そのため、if文を書くときは、分岐先を決めるための条件を指定しなければなりません。
また、if文には「if else文」などと呼ばれる書き方もあります。条件が成立したらこちら、しなければこちらというように、2つの処理のいずれかを選択できる方法です。
C#におけるif文の書き方
実行したい処理をプログラム中に記述したもののことを「ステートメント」といいます。プログラムには、多数のステートメントが含まれているのが通常です。
C#のステートメントは、さまざまな種類に分類されています。「選択ステートメント」と「反復(繰り返し)ステートメント」は、その代表例といえるでしょう。
今回解説するif文は、選択ステートメントの一つです。これは条件分岐のための記述であり、どの処理を実行するかを条件に応じて「選択」するという意味があります。なお、if文以外では、switch文も選択ステートメントです。
反復ステートメントは、ループのことだと理解すればよいでしょう。while文やfor文、foreach文など、一定の処理を繰り返す構文がこれに該当します。
if文の記法
if文の基本形は、次のとおりです。
if (ブール式) { 条件が成立した場合に実行する処理 }
「ブール式」とは、結果が「true」か「false」のいずれかになる計算式のことです。if文は、この式の計算結果が「true」だった場合に「条件が成立した」とみなして、中括弧の内側にある処理を実行します。
まずは、if文が動作する様子を具体的なプログラムで確認してみましょう。
サンプルコード:
var x = 123; if (x < 100) { Console.WriteLine("xは100より小さいです。"); } if (x > 100) { Console.WriteLine("xは100より大きいです。"); }
実行結果:
xは100より大きいです。
プログラム中に、if文が2つあるのがわかるでしょうか。それぞれの条件に応じて、メッセージを表示する処理を行なうかどうかを選択しています。
1つ目のif文の条件「x < 100」は、「x」の値が100より小さい場合に「true」となるブール式です。実際の「x」の値は「123」のため、式の計算結果は「false」となります。その結果、メッセージを表示する処理は実行されません。
一方、2つ目のif文の「x > 100」が「true」になるのは、「x」の値が100より大きい場合です。こちらは実際の計算結果も「true」となるため、中括弧内の処理が実行されメッセージが表示されています。
次に、もう1つのif文の書き方を確認しましょう。いわゆる「if else文」の記法です。
サンプルコード:
var x = 123; if (x < 100) { Console.WriteLine("xは100より小さいです。"); } else { Console.WriteLine("xは100より小さくありません。"); }
実行結果:
xは100より小さくありません。
「else」というキーワードを使い、1つのif文に対して2つの処理を記述している様子がわかるでしょう。この書き方をすると、ブール式が「true」の場合には1つ目の処理、「false」の場合には2つ目の処理が実行されます。
if文とブロック
C#のif文は、次のように中括弧を省いて記述することもできます。
if (x < 100) Console.WriteLine("xは100より小さいです。");
しかし、中括弧の省略には注意が必要なケースがあります。例えば次のように書くと、実際の動作が期待と異なるものになってしまうでしょう。
var x = 123; if (x < 100) Console.WriteLine("if文の条件が成立しました。"); Console.WriteLine("xは100より小さいです。");
このif文では、条件が成立した場合にメッセージを2つ表示することを意図しています。ところが、この書き方は、実際には次のように記述するのと同じです。
var x = 123; if (x < 100) { Console.WriteLine("if文の条件が成立しました。"); } Console.WriteLine("xは100より小さいです。");
中括弧を省略したために、2つ目のメッセージはif文の条件が成立したかどうかによらず、必ず表示されてしまうのです。意図どおりの動作にするには、次のように記述する必要があります。
if (x < 100) { Console.WriteLine("if文の条件が成立しました。"); Console.WriteLine("xは100より小さいです。"); }
このような中括弧で囲まれた範囲のことを、C#では「ブロック」と呼びます。ブロックを使えば、通常は1つの処理しか記述できない場所にでも、複数の処理をひとまとめにして埋め込むことが可能です。
不要な問題を避けるためにも、if文を使うときは、中括弧をつけてブロックにする書き方を基本とするのがよいでしょう。
if文の入れ子
次の例のように、if文のブロックの内側には、別のif文も記述できます。
if (x % 2 == 0) { if (x % 5 == 0) { Console.WriteLine("xは偶数で、5の倍数です。"); } }
これは、「入れ子(ネスト)」と呼ばれる書き方です。入れ子は必要なだけ重ねることができ、例えば2つ目のif文の内側に、さらにif文を追加しても問題ありません。
入れ子が可能なのは「else」側のブロックも同様で、例えば次のように記述できます。
if (x % 2 == 0) { Console.WriteLine("xは偶数で、2の倍数です。"); } else { if (x % 5 == 0) { Console.WriteLine("xは奇数で、5の倍数です。"); } }
このようにして複数のif文を組み合わせれば、より複雑な条件を判定するプログラムも書けるようになるでしょう。
連続するif文
先ほどの「else」側での入れ子の例は、次のように書くのと同じです。
if (x % 2 == 0) { Console.WriteLine("xは偶数で、2の倍数です。"); } else if (x % 5 == 0) { Console.WriteLine("xは奇数で、5の倍数です。"); }
「else」側の処理をブロックにするための中括弧が、省略された書き方になっているのがわかるでしょうか。意味合いとしては「else」の内側にif文があるのですが、見た目上は連続するif文のような形式になっています。これは「else if」などと呼ばれる記法で、入れ子の一種です。
次の例のように、「else if」は連続して必要なだけ記述できます。
if (x % 2 == 0) { Console.WriteLine("xは偶数です。"); } else if (x % 3 == 0) { Console.WriteLine("xは奇数で、3の倍数です。"); } else if (x % 5 == 0) { Console.WriteLine("xは奇数で、3の倍数ではなく、5の倍数です。"); } else { Console.WriteLine("xは奇数で、3の倍数ではなく、5の倍数でもありません。"); }
この記法では、数珠つなぎになったブール式が上から順にチェックされていきます。実行されるのは、最初に条件が成立したif文の処理だけです。どの条件も成立しなかった場合は、最後にある「else」の処理が実行されます。
「else if」は、分岐先が多い場合に便利な書き方だといえるでしょう。
C#のif文とともに用いられる演算子
ここまでの例で登場したブール式では、計算結果が「true」か「false」かを決める演算子が用いられていました。if文とともに使用できる演算子には、さまざまな種類があります。ここでは、実際のプログラミングで使われることの多い、代表的な演算子についてみていきましょう。
比較演算子
「比較演算子」は、2つの値の大小関係を判定し、その結果を「true」または「false」にします。ここまでの例では、「x < 100」などで使われていました。
比較演算子には、以下の4つがあります。
・小なり演算子「<」:左の値が右の値より小さい場合に「true」となる
・大なり演算子「>」:左の値が右の値より大きい場合に「true」となる
・小なりイコール演算子「<=」:左の値が右の値より小さいか、等しい場合に「true」となる
・大なりイコール演算子「>=」:左の値が右の値より大きいか、等しい場合に「true」となる
等値演算子
「等値演算子」は、2つの値の等しさを判定し、その結果を「true」または「false」にします。ここまでの例では、「x % 2 == 0」などで使われていました。
等値演算子には、以下の2つがあります。
・等値演算子(==):左の値と右の値が等しい場合に「true」となる
・非等値演算子(!=):左の値と右の値が等しくない場合に「true」となる
ブール論理演算子
「ブール論理演算子」は、「true」と「false」に関する計算を行ないます。if文とともに使われることが多いのは、以下の3つです。
・論理否定演算子(!):「true」と「false」を反転させる(いわゆる「NOT条件」)
・条件付き論理AND演算子(&&):2つの値がいずれも「true」の場合にのみ「true」となる(いわゆる「AND条件」)
・条件付き論理OR演算子(||):2つの値の少なくとも一方が「true」の場合に「true」となる(いわゆる「OR条件」)
このあと説明するように、ブール論理演算子は1つのif文に複数の条件を指定したい場合に用いられます。
C#のif文に複数条件を指定するには
C#ではif文を入れ子にしたり、「else if」の記法を用いたりすれば、複雑な条件分岐も実現できることを説明しました。ブール論理演算子を活用すれば、これらと同じ意味の条件分岐を、より少ないif文で効率的に記述できる場合があります。
AND条件で入れ子を減らす
入れ子になったif文は、AND条件でよりコンパクトに記述できる場合があります。例えば、次の2つのプログラムを実行すると、どちらも同じ結果を出力するでしょう。
if (x % 2 == 0) { if (x % 5 == 0) { Console.WriteLine("xは偶数で、5の倍数です。"); } }
if ((x % 2 == 0) && (x % 5 == 0)) { Console.WriteLine("xは偶数で、5の倍数です。"); }
入れ子になった内側のif文の処理は、外側と内側の両方のブール式が「true」の場合にのみ実行されます。そのため、2つのブール式をAND条件で1つにまとめても、結果は同じになるのです。
では、「else」側の入れ子についてはどうでしょうか。次の2つのプログラムを見比べてみてください。
if (x % 2 == 0) { ; } else { if (x % 5 == 0) { Console.WriteLine("xは奇数で、5の倍数です。"); } }
if (!(x % 2 == 0) && (x % 5 == 0)) { Console.WriteLine("xは奇数で、5の倍数です。"); }
入れ子の外側のブール式をNOT条件で反転させたうえで、AND条件を用いて内側のブール式とまとめている様子がわかるでしょう。「else」側の処理はブール式が「false」になった場合に実行されるため、これら2つのプログラムも、やはり同じ結果を出力するのです。
OR条件でif文をまとめる
OR条件を活用すると、複数のif文をコンパクトに記述できる場合があります。例えば、次のような2つのif文があったとしましょう。
if (x % 5 == 1) { Console.WriteLine("条件が成立しました。"); } if (x % 5 == 2) { Console.WriteLine("条件が成立しました。"); }
これら2つのif文は、2つの条件のどちらかが成立したときに特定の処理を実行することを意図したものです。そのために、まったく同じ処理内容が2度記述されており、やや冗長なプログラムになっています。
このような場合は、OR条件を用いてif文を減らせないか検討してみるとよいでしょう。ここでは、次のようにする方法が考えられます。
if ((x % 5 == 1) || (x % 5 == 2)) { Console.WriteLine("条件が成立しました。"); }
2つのブール式がOR条件で1つにまとめられ、同じ処理を2度記述する必要がなくなりました。
C#のif文を使いこなせば複雑な条件分岐も可能になる
if文は、C#に限らず多くのプログラミング言語で採用されている条件分岐のための構文です。C#においては「選択ステートメント」の一種であり、ループを意味する「反復ステートメント」と併せてプログラミングの基本要素といえるでしょう。
if文に分岐の条件を指定するには、計算結果が「true」か「false」のどちらかになる「ブール式」を使用します。複数のif文を入れ子にしたり、「else if」の記法で連続させたりすれば、より複雑な条件による分岐も実現可能です。
また、可能であればブール論理演算子を活用して、ブール式を1つにまとめるのもよいでしょう。if文を書く回数を減らし、プログラムをコンパクトに保つのに役立ちます。