比較と論理演算子
条件を式で表す
成績管理アプリでは「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 >= 60 | 1 |
attend >= 10 | 1 |
score >= 60 && attend >= 10 | 1 |
score >= 90 && attend >= 10 | 0 |
score >= 90 || attend >= 10 | 1 |
!(score >= 60) | 0 |
&& と & は別ものです
&& を1つだけにした & は、ビットごとの計算をする別の演算子です。scanf の前に付けた & ともまた違います。条件をつなぐときは必ず2つ重ねてください。
左が決まれば右は見ない
&& は、左が偽ならその時点で結果が偽に決まるので、右を計算しません。|| は左が真なら右を見ません。これを短絡評価と呼びます。第5章で関数を書くようになると、右側の関数が呼ばれないという形で表に出てきます。
要件
- 点数と出席回数を scanf で読む
- 60点以上かどうかを %d で出す
- 出席10回以上かどうかを %d で出す
- 合格かどうかを && で組み立てて %d で出す
- 「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編集部