なぜ、判定条件の理解が重要なのか、その理由

この記事では、当社の新人エンジニア研修の参考にC#を解説します。

前回は「演算子でプログラムに計算させる」について学びました。算術演算子、キャスト演算子などについて学びましたね。

今回は条件分岐判定条件についてです。プログラムは条件によって処理を変えることができます。

たとえば駅の改札でICカードの残高をチェックしてゲートを開けるかどうか決めるように、人間の仕事を置き換える重要な仕組みです。

あわせて、前回触れられなかった

  • 関係演算子(比較演算子)
  • 三項演算子
  • 論理演算子

についても解説します。

1. if

C#でも、if 文を使うことで、条件に応じて「処理をする / しない」を表現できます。
たとえば、「もし20歳以上ならお酒を飲む」のようなロジックです。

新人エンジニア
条件がtrueの場合のみ処理をするif文

if(条件式) { ... }

using System;

namespace Chap04
{
    public class Example01
    {
        public static void Main(string[] args)
        {
            int age = 20;
            if (age >= 20)
            {
                Console.WriteLine("お酒を飲む");
            }
        }
    }
}

  1. if (age >= 20)条件式bool 型の値(true または false)を返す必要があります。
  2. ここでは age >= 20true かどうかを評価し、true なら { ... } のブロックが実行されます。
  3. age = 20 の場合は「お酒を飲む」と出力。age = 19 の場合は何も出力しません。

2. 関係演算子(比較演算子)

関係演算子は、2つの式や値を比較し、結果を truefalse で返します。よく使うものを挙げると:

演算子読み方結果
==イコールイコール1 == 1true
!=びっくりイコール1 != 2true
>大なり1 > 2false
<小なり1 < 2true
>=大なりイコール1 >= 2false
<=小なりイコール1 <= 2true

=代入の意味なので、「等しい」は == で表現します。

using System;

namespace Chap04
{
    public class Example02
    {
        public static void Main(string[] args)
        {
            Console.WriteLine(1 == 1);  // true
            Console.WriteLine(1 != 2);  // true
            Console.WriteLine(1 > 2);   // false
            Console.WriteLine(1 < 2);   // true
            Console.WriteLine(1 >= 2);  // false
            Console.WriteLine(1 <= 2);  // true
        }
    }
}

if文の省略記法と注意点

if (age >= 20) Console.WriteLine("お酒を飲む");

このように1行だけならブロック { } を省略してもOKですが、複数行に及ぶ場合は{}で囲みましょう。省略によって意図せず処理が外側に漏れてしまうバグを防ぐため、{}を付ける習慣を推奨します。

int age = 19;
if (age >= 20)
    Console.WriteLine("お酒を飲む");
    Console.WriteLine("たばこも吸う");

↑ この場合、2行目のみが if の対象で、3行目は常に実行されます。
つまり age = 19 でも「たばこも吸う」が出力されてしまう。

3. if - else

「もし20歳以上ならお酒を飲む。そうでなければジュースを飲む」のように、条件がfalseの場合に別処理を行いたいなら、else を使います。

新人エンジニア
条件がfalseの場合にも処理をするif文
using System;

namespace Chap04
{
    public class Example06
    {
        public static void Main(string[] args)
        {
            int age = 19;
            if (age >= 20)
            {
                Console.WriteLine("お酒を飲む");
            }
            else
            {
                Console.WriteLine("ジュースを飲む");
            }
        }
    }
}


20未満の場合は後者が実行されます。

if ... else if ... else ... の多岐分岐

using System;

namespace Chap04
{
    public class Example07
    {
        public static void Main(string[] args)
        {
            int score = 88;
            if (score >= 90)
            {
                Console.WriteLine("A");
            }
            else if (score >= 80)
            {
                Console.WriteLine("B");
            }
            else if (score >= 70)
            {
                Console.WriteLine("C");
            }
            else
            {
                Console.WriteLine("D");
            }
        }
    }
}

スコア90以上はA、80以上はB、70以上はC、それ以外はDと表示します。

条件が増えるほど if-else 構文が長くなり可読性が下がるケースがあります。そのときに次で紹介するswitch文が使えることもあります。

4. switch

C#のswitch文は、ある式の値に応じて複数のケースに分岐できる文法です。
書式はおおむね次のようになります。

switch (式)
{
    case 値A:
        // 式が値Aの場合の処理
        break;
    case 値B:
        // 式が値Bの場合の処理
        break;
    default:
        // どのcaseにも当てはまらない場合の処理
        break;
}

char, byte, short, int, stringenumswitch 文で使えます。

using System;

namespace Chap04
{
    public class Example08
    {
        public static void Main(string[] args)
        {
            int score = 88;
            switch (score / 10)
            {
                case 7:
                    Console.WriteLine("C");
                    break;
                case 8:
                    Console.WriteLine("B");
                    break;
                case 9:
                case 10:
                    Console.WriteLine("A");
                    break;
                default:
                    Console.WriteLine("D");
                    break;
            }
        }
    }
}

  1. score / 108 の場合、Bと表示されます。
  2. score / 109 または 10 の場合はAと表示します(「フォールスルー」活用の一例)。

フォールスルー(breakを書かない場合)

switch (score / 10)
{
    case 7:
        Console.WriteLine("C");
    case 8:
        Console.WriteLine("B");
    case 9:
    case 10:
        Console.WriteLine("A");
    default:
        Console.WriteLine("D");
}

break; を書かないと、マッチした箇所から最後まで実行されるので、例えば、意図せずC, B, A, D... のように複数行が出力される可能性があります。C#は明示的なbreakがないとフォールスルーしますので注意してください。

5. 三項演算子

三項演算子(?:)を使うと、「もし条件式がtrueならA、falseならB」のようなコンパクトな条件分岐を表現できます。

新人エンジニア
三項演算子の見方
using System;

namespace Chap04
{
    public class Example10
    {
        public static void Main(string[] args)
        {
            char c = 'y';
            // 三項演算子
            string result = (c == 'y') ? "Yes" : "No";
            Console.WriteLine(result);
        }
    }
}

<実行結果>

Yes

  • c == 'y' が true なら「Yes」、false なら「No」が result へ代入されます。

三項演算子は短い判定には有用ですが、複雑な入れ子や長大な式を作ると読みにくくなります。注意しましょう。

6. 論理演算子

論理演算子を使うと、複数の条件を組み合わせて複雑な真偽値を作ることができます。C#では以下の演算子が基本です。

演算子読み方trueとなる条件
&&かつ(AND)左辺と右辺がともに truegender == 'F' && age >= 16
||または(OR)すくなくとも左辺と右辺のどちらかがtruegender == 'F' || age >= 16
!否定(NOT)条件式が false のとき true を返す!(gender == 'F')
^排他的OR(XOR)左辺と右辺の一方のみが true (両方trueはfalse)gender == 'F' ^ age >= 16

XORは使用頻度が低いので、まずは AND / OR / NOT を押さえましょう。

using System;

namespace Chap04
{
    public class Example11
    {
        public static void Main(string[] args)
        {
            Console.WriteLine(true && true);   // true
            Console.WriteLine(true && false);  // false
            Console.WriteLine(true || false);  // true
            Console.WriteLine(!true);          // false
            Console.WriteLine(!false);         // true
        }
    }
}


例:英語と数学の両方が80点以上ならS評価

using System;

namespace Chap04
{
    public class Example12
    {
        public static void Main(string[] args)
        {
            int english = 80;
            int math = 75;

            if (english >= 80 && math >= 80)
            {
                Console.WriteLine("S");
            }
            else if (english >= 80 || math >= 80)
            {
                Console.WriteLine("A");
            }
            else if (english >= 70 || math >= 70)
            {
                Console.WriteLine("B");
            }
            else
            {
                Console.WriteLine("C");
            }
        }
    }
}

実行結果の予想

english = 80 かつ math = 75 なので、最初の if 条件 (&&) はfalse → 次の else if (||) はtrue → "A" 出力となります。

7. 演算子の優先順位

ここまで学んだ主な演算子の優先度は、算術演算子 > 関係演算子 > 論理演算子 の順です。

  1. 算術演算子(+ - * / % など)は、関係演算子(>==など)より先に計算されます。
    • 1 + 1 > 2 - 1(1 + 1) > (2 - 1)2 > 1true
  2. 関係演算子は論理演算子(&&||)より先に評価されます。
    • 1 == 1 && 2 >= 1(1 == 1) && (2 >= 1)true && truetrue

さらに論理演算子の中では &&|| より優先されます。

  • a > 10 && b < 5 || c == 0(a > 10 && b < 5) || c == 0 と解釈されます。

条件の否定

// a + 1 > b - 10 の否定は?
!(a + 1 > b - 10)
// カッコを開くと
a + 1 <= b - 10

  • 不等号を逆にし、イコールの有無を反転させれば良いというルールです。
  • 論理演算子を否定するときは &&|| も入れ替わるので注意が必要です。

論理クイズ「 正直村 と うそつき村 」の答えを説明してみましょう

ある旅人が分かれ道にやってきた。 片方は正直村に、片方はうそつき村へと続いている。 旅人は正直村に行きたいのだが、どっちが正直村なのかがわからない。 分かれ道にはどちらかの村の村人がいる。 この村人に一回だけ質問をして 正直村に行く道を見つけだすにはなんと聞けばいいか? ただし、村人は、 どちらの村の住人かわからない。また、正直村の住人は必ず正直な答えをし、 うそつき村の住人はかならず嘘の答えをする。

解答:片方の村を指差して 「あなたの住んでいる村はこっちですか?」と聞く

ヒント:!(false) == true

<まとめ:隣の人に正しく説明できたらチェックを付けましょう>

□ if文を使って、条件に応じた処理を行う/行わないを表現できる

□ 関係演算子は2つの値を比較して true/false を返す(==, !=, >, <, >=, <=)

□ 多岐分岐には if-else チェーンや switch 文が使える

□ 三項演算子 ?: は1行で簡潔に条件分岐を記述できる(複雑になりすぎないよう注意)

□ 論理演算子(&&, ||, !など)で複数条件を組み合わせ可能

次回は、「5章. 繰り返しで単純作業をコンピュータに任せる」を学びます。


最後までお読みいただきありがとうございます。