比較と論理演算子

条件を式で表す

成績管理アプリでは「60点以上なら合格」のような判定をします。次章の if 文でその判定を使いますが、その前に、判定そのものを書けるようにします。

比較演算子

2つの値を比べる記号は6つです。

  • == 等しい
  • != 等しくない
  • < 小さい
  • > 大きい
  • <= 以下
  • >= 以上

等しいかどうかは = ではなく == です。= は代入なので、score = 60 と書くと比較ではなく「score に 60 を入れる」になってしまいます。C はこれをエラーにしないので、自分で気をつけるしかありません。

比較の結果は 1 か 0 の整数

ここが C の特徴です。多くの言語では比較の結果は真偽値ですが、C には専用の型がありません。条件が成り立てば 1、成り立たなければ 0 という int の値になります。だから %d でそのまま表示できます。

int score = 78; printf("%d\n", score >= 60); /* 1 */ printf("%d\n", score == 100); /* 0 */

逆に、条件として扱われるときは 0 以外がすべて真 です。if (3) は成り立つ、と覚えてください。この性質は第3章で効いてきます。

論理演算子で組み合わせる

条件を組み合わせる記号は3つです。

  • && かつ。両方が真のときだけ真
  • || または。どちらかが真なら真
  • ! でない。真と偽をひっくり返す
int passed = (score >= 60) && (attend >= 10);

「60点以上かつ出席10回以上なら合格」がそのまま式になります。丸かっこは無くても && より >= のほうが先に計算されますが、読みやすさのために付けておくことをおすすめします。

実際に値を入れて確かめると次のようになります。点数が 78、出席が 12 のときです。

score >= 601
attend >= 101
score >= 60 && attend >= 101
score >= 90 && attend >= 100
score >= 90 || attend >= 101
!(score >= 60)0

&& と & は別ものです

&& を1つだけにした & は、ビットごとの計算をする別の演算子です。scanf の前に付けた & ともまた違います。条件をつなぐときは必ず2つ重ねてください。

左が決まれば右は見ない

&& は、左が偽ならその時点で結果が偽に決まるので、右を計算しません。|| は左が真なら右を見ません。これを短絡評価と呼びます。第5章で関数を書くようになると、右側の関数が呼ばれないという形で表に出てきます。

要件

  1. 点数と出席回数を scanf で読む
  2. 60点以上かどうかを %d で出す
  3. 出席10回以上かどうかを %d で出す
  4. 合格かどうかを && で組み立てて %d で出す
  5. 「60点以上 1」のように、ラベルと半角空白1つと値を並べて3行出す

入出力例

main("75 12") → "60点以上 1 出席10回以上 1 合格 1" main("58 12") → "60点以上 0 出席10回以上 1 合格 0" main("75", "4") → "60点以上 1 出席10回以上 0 合格 0"

ヒント

生田 陸人
ゆめさくエンジニア / 現役ソフトウェアエンジニア
編集 LuaGate編集部
main.c
学習モード

メモ

比較と論理演算子

⌘S で保存