{ }codelper

学ぶ › C#

制御フロー · 05

条件分岐

条件によって違う処理をします:if・else if・else、そして switch。

条件文は「もし〜なら」をコードにしたものです。
上から順に条件を見て、最初に真になった分岐一つだけを実行します。
下の例は点数から成績をつけ、偶数かどうかも教えてくれます。

using System; class Program{    static void Main()    {        int score = int.Parse(Console.ReadLine());        if (score >= 90)            Console.WriteLine("A");        else if (score >= 80)            Console.WriteLine("B");        else if (score >= 70)            Console.WriteLine("C");        else            Console.WriteLine("F");        Console.WriteLine(score % 2 == 0 ? "even" : "odd");    }}
stdin
75
stdout
C
odd

ポイント

  • 条件は上から見ます。
    だから厳しい基準から書きます。
    score >= 70 を先に書くと、95点でも C になります。
  • すべて偽なら else の分岐を実行します。
    else はなくてもかまいません。
  • 条件をつなぐ論理演算子:かつ &&、または ||、でない !。
    Python は and、or、not です。
    前で答えが決まれば後ろは計算しません(x != 0 && 10 / x > 1 は安全です)。
  • 一つの値をいくつもの場合と比べるときは switch のほうが読みやすいです。
    「次の場合へ続けて落ちるか」は言語によって違います。
  • 短い二択は三項演算子で:条件 ? 真のとき : 偽のとき(Python は A if 条件 else B)。

言語ごとの書き方

Pythonif 条件: / elif 条件: / else: — 括弧の代わりに : とインデント。
switch は 3.10 から match x: + case 1 | 2: + case _:
JavaScriptif (条件) { } else if (条件) { } else { } — switch は case ごとに break がないと次の case へ続きます。
値は === で比較
TypeScriptJavaScript と同じです。
型の違う値どうしを比べると、コンパイル時に教えてくれます
Javaif (条件) { } else if (条件) { } else { } — switch は break が必要。
Java 14 からの case 1, 2 -> … は続きません
C#if (条件) { } else if (条件) { } else { } — switch は中身のある case ごとに break(または return)が必須です(忘れるとコンパイルエラー)
C++if (条件) { } else if (条件) { } else { } — switch は整数(文字を含む)だけ。
break がないと次の case へ続きます
CC++ と同じです。
真・偽は 0 以外の数と 0 です
Craykonもし (条件) { } でなければ もし (条件) { } でなければ { } — 選択 (x) { 場合 1, 2: … それ以外: … } は合った場合を一つだけ実行し、続きません

よくある間違い

== の代わりに = を書いたC · C++ · JavaScript · TypeScript

if (x = 5) {
    printf("五");
}

→ x に 5 が入り、条件は常に真になります

比較は ==。
Java・C#・Python・Craykon はこのミスをエラーで教えてくれます。

1 < x < 10 のようにつなげて書いたJavaScript · C · C++ · Craykon

let x = 50;
console.log(1 < x < 10);

→ true — (1 < x) が先に true になり、true < 10 が真

1 < x && x < 10 と分けて書きます。
数学のようにつなげられるのは Python だけです(TypeScript・Java・C# はコンパイルエラー)。

switch で break を忘れたC · C++ · Java · JavaScript

switch (n) {
    case 1: puts("一");
    case 2: puts("二");
}

→ n が 1 だと「一」と「二」の両方が出ます

case ごとに break;。
C# はコンパイルエラーで、Craykon の 選択 は最初から続かないように防ぎます。

言語ごとの違い
JavaScript・TypeScript で等しさを比べるときは === を使います。
== は型を変換して比べるので、"1" == 1 も "" == 0 も true です。
Craykon の == は === と同じく厳密で、"1" == 1 は 偽 です。

練習問題