C言語基礎|評価と条件分岐

評価とは何か

C言語では、ほとんどすべての式には値があります
そして、その値はプログラムの実行中に調べられます。

この
「式の値を調べること」評価(evaluation) と呼びます。

たとえば、次のようなものはすべて「式」です。

  • 変数
  • 定数
  • 演算子で組み合わされたもの

プログラムは、実行時にそれらを順番に評価し、
型と値を決定しながら処理を進めています。

式が評価されるイメージ

具体例で考えてみましょう。

変数 score が int 型で、値が 68 だとします。

評価結果
scoreint 68
score + 12int 80
score / 2int 34
score > 60int 1
score == 100int 0

このように、

  • 数値計算の結果も
  • 比較の結果も

すべて値として評価されています。

条件分岐と評価の関係

if 文では、( ) の中に置かれた式を評価します。
この式を 制御式 と呼びます。

制御式の評価結果が、

  • 0 → 偽(条件不成立)
  • 0以外 → 真(条件成立)

として扱われます。

そのため、比較演算子や関係演算子が
1 または 0 を生成する ことが、とても重要になります。

サンプルプログラム

ここでは次の処理を行うプログラムを例に分岐条件と評価について解説をします。

テストの点数を読み込み、
合格か不合格かを判定して表示する

プロジェクト名:chap3-7-1 ソースファイル名:chap3-7-1.c

Visual Studio でこのプログラムを実行するには、SDLチェック設定を変更しておく必要があります。
1.プロジェクト名を右クリックして、「プロパティ」をクリックします。
2.「C/C++」→「全般」→「SDLチェック」を「いいえ」に切り替えて「OK」をクリックします。

#include <stdio.h>

int main(void)
{
    int score;

    printf("点数を入力してください:");
    scanf("%d", &score);

    if (score >= 60)
        puts("判定:合格です。");
    else
        puts("判定:不合格です。");

    return 0;
}

評価の流れ

制御式評価結果実行される処理
score >= 601合格メッセージ
score >= 600不合格メッセージ

条件分岐は、評価結果に従って処理を切り替えている
という点がポイントです。

評価される式の具体例

次の例では、score が 68 の場合を想定します。

評価結果
score >= 60int 1
score < 60int 0
score / 10int 6
score / 10.0double 6.8
(int)6.8int 6

評価の結果は 型付きの値であることを、常に意識しましょう。

2値の最大値を求める

次は、二つの整数の 大きい方を変数に保存してから表示する例です。

サンプルプログラム

プロジェクト名:chap3-7-2 ソースファイル名:chap3-7-2.c

Visual Studio でこのプログラムを実行するには、SDLチェック設定を変更しておく必要があります。
1.プロジェクト名を右クリックして、「プロパティ」をクリックします。
2.「C/C++」→「全般」→「SDLチェック」を「いいえ」に切り替えて「OK」をクリックします。

#include <stdio.h>

int main(void)
{
    int a, b;
    int bigger;

    printf("整数A:");
    scanf("%d", &a);
    printf("整数B:");
    scanf("%d", &b);

    if (a > b)
        bigger = a;
    else
        bigger = b;

    printf("より大きい値は%dです。\n", bigger);

    return 0;
}

ポイント

  • 条件式 a > b は評価され、1 または 0 を生成
  • 評価結果に応じて代入が行われる
  • 表示処理が1箇所で済み、修正しやすい

3値の最大値を求める

続いて、三つの整数の最大値を求めます。

サンプルプログラム

プロジェクト名:chap3-7-3 ソースファイル名:chap3-7-3.c

Visual Studio でこのプログラムを実行するには、SDLチェック設定を変更しておく必要があります。
1.プロジェクト名を右クリックして、「プロパティ」をクリックします。
2.「C/C++」→「全般」→「SDLチェック」を「いいえ」に切り替えて「OK」をクリックします。

#include <stdio.h>

int main(void)
{
    int x, y, z;
    int max;

    printf("整数を3つ入力してください。\n");
    scanf("%d%d%d", &x, &y, &z);

    max = x;

    if (y > max)
        max = y;

    if (z > max)
        max = z;

    printf("最大の値は%dです。\n", max);

    return 0;
}

変数 max の変化

手順max の値
初期化x
y > maxy(条件成立時)
z > maxz(条件成立時)

評価と代入を組み合わせることで、
段階的な判断が実現されています。

演習問題

演習3-5(最小値の判定)

三つの整数値を読み込み、その最小値を求めて表示するプログラムを作成せよ。

解答例

プロジェクト名:chap3-7-4 ソースファイル名:chap3-7-4.c

Visual Studio でこのプログラムを実行するには、SDLチェック設定を変更しておく必要があります。
1.プロジェクト名を右クリックして、「プロパティ」をクリックします。
2.「C/C++」→「全般」→「SDLチェック」を「いいえ」に切り替えて「OK」をクリックします。

#include <stdio.h>

int main(void)
{
    int a, b, c;
    int min;

    scanf("%d%d%d", &a, &b, &c);

    min = a;

    if (b < min)
        min = b;

    if (c < min)
        min = c;

    printf("最小値は%dです。\n", min);

    return 0;
}

演習3-6(4値の最大値)

四つの整数値を読み込み、その最大値を求めて表示するプログラムを作成せよ。

解答例

プロジェクト名:chap3-7-5 ソースファイル名:chap3-7-5.c

Visual Studio でこのプログラムを実行するには、SDLチェック設定を変更しておく必要があります。
1.プロジェクト名を右クリックして、「プロパティ」をクリックします。
2.「C/C++」→「全般」→「SDLチェック」を「いいえ」に切り替えて「OK」をクリックします。

#include <stdio.h>

int main(void)
{
    int a, b, c, d;
    int max;

    scanf("%d%d%d%d", &a, &b, &c, &d);

    max = a;

    if (b > max) max = b;
    if (c > max) max = c;
    if (d > max) max = d;

    printf("最大値は%dです。\n", max);

    return 0;
}

まとめ

  • 式は実行時に評価され、型と値を持つ。
  • 比較演算や関係演算は 1 または 0 を生成する。
  • if 文は、評価結果をもとに処理を分岐する。
  • 評価と条件分岐を理解すると、複雑な判断処理が書けるようになる。