08_C言語の演算子(operators)

08-1 学習目標


08-2 演算子とは?

演算子(operator)とは、値に対して演算を行う記号です。C言語では、計算や比較などを行うためにさまざまな演算子が用意されています。

例: +(加算)、*(乗算)、==(等しい)など


08-3 算術演算子(復習)

C言語の基本的な数値演算は以下の算術演算子で行います。ここでは簡単に復習として確認します。

演算子 意味 結果
+ 加算 3 + 2 5
- 減算 3 - 2 1
* 乗算 3 * 2 6
/ 除算 7 / 2 3(整数同士なら切り捨て)
% 剰余 7 % 2 1(余り)

🔸 %整数同士にしか使えません。実数(floatやdouble)と一緒に使うとコンパイルエラーになります。


08-4 複合代入演算子

複合代入演算子は、「演算を行い、その結果を同じ変数に代入する」ための短縮記法です。

x += 3;   // x = x + 3 と同じ意味
x *= 2;   // x = x * 2 と同じ意味

実行例:

ファイル名:08-6_compound_assignment.c

#include <stdio.h>
int main(void) {
    int a = 5;
    a += 3;
    printf("a = %d\n", a);  // a = 8

    int b = 10;
    b -= 4;
    printf("b = %d\n", b);  // b = 6

    int c = 3;
    c *= 4;
    printf("c = %d\n", c);  // c = 12

    int d = 20;
    d /= 5;
    printf("d = %d\n", d);  // d = 4

    int e = 13;
    e %= 5;
    printf("e = %d\n", e);  // e = 3

    return 0;
}

出力結果:

a = 8
b = 6
c = 12
d = 4
e = 3

08-5 インクリメント・デクリメント演算子

インクリメント(++)とデクリメント(--)は、変数の値をそれぞれ 1 増やす/減らす単項演算子です。

これらには 前置後置 の2つの使い方があります。

演算子 タイミング 動作
++x 前置インクリメント y = ++x; x を 1 増やしてから y に代入
x++ 後置インクリメント y = x++; y に x を代入したあと x を 1 増やす
--x 前置デクリメント y = --x; x を 1 減らしてから y に代入
x-- 後置デクリメント y = x--; y に x を代入したあと x を 1 減らす

実行例:前置と後置の違い

ファイル名:08-5_increment_example.c

#include <stdio.h>
int main(void) {
    int x = 5;
    int y;

    y = ++x;
    printf("前置インクリメント: x = %d, y = %d\n", x, y);  // x=6, y=6

    x = 5;
    y = x++;
    printf("後置インクリメント: x = %d, y = %d\n", x, y);  // x=6, y=5

    x = 5;
    y = --x;
    printf("前置デクリメント: x = %d, y = %d\n", x, y);  // x=4, y=4

    x = 5;
    y = x--;
    printf("後置デクリメント: x = %d, y = %d\n", x, y);  // x=4, y=5

    return 0;
}

出力結果

前置インクリメント: x = 6, y = 6
後置インクリメント: x = 6, y = 5
前置デクリメント: x = 4, y = 4
後置デクリメント: x = 4, y = 5

このように、式の評価タイミングによって結果が変わるため、使い分けに注意しましょう。

演算子 意味 使用例 説明
++ インクリメント ++x 変数の値を1増やす
-- デクリメント --x 変数の値を1減らす

08-6 優先順位と括弧の活用

演算子には計算の優先順位があり、以下の順で評価されます:

  1. 括弧 ()
  2. 単項 ++ -- !
  3. 算術 * / %
  4. 算術 + -
  5. 比較 < <= > >=
  6. 比較 == !=
  7. 論理 &&
  8. 論理 ||
  9. 条件 ?:
  10. 代入 = += -= *= /=

例:

int x = 3 + 2 * 4;     // 結果は11(先に掛け算)
int y = (3 + 2) * 4;   // 結果は20(括弧で明示)

08-7 比較演算子と論理演算子

比較演算子(2つの値を比較する)

演算子 意味 結果(真は1、偽は0)
== 等しい x == 5 1(xが5なら)
!= 等しくない x != 0 1(xが0以外なら)
> より大きい x > 10 1(xが10より大きい)
< より小さい x < 3 1(xが3未満)
>= 以上 x >= 70 1(70以上)
<= 以下 x <= 100 1(100以下)

🔸 C言語では「偽=0、真=0以外の値」として評価されます。比較演算や論理演算の結果として返される値が 0 であれば「偽」、0 以外であれば「真」と見なされます。

たとえば以下のように、数値そのものを条件式に使うこともできます:

if (x) {
    // x が 0 以外であれば実行される
}

より詳しい内容は if 文の解説で取り上げます。ここでは「0 が偽、それ以外が真」と判断されるという点だけ覚えておきましょう。

論理演算子(条件を組み合わせる)

演算子 意味 使用例 結果
&& AND(かつ) x > 0 && x < 10 両方満たせば真
`| ` OR(または) `x < 0 x > 100` どちらか満たせば真
! NOT(否定) !(x == 0) 条件の反転

08-8 短絡評価(ショートサーキット)

論理演算子 &&|| を使うとき、必要に応じて後半の評価が省略されることがあります。これを短絡評価(ショートサーキット)と呼びます。

if (x != 0 && 10 / x > 1) {
    // xが0でなければ除算が実行される
}

上記では x != 0 が偽なら 10 / x は評価されません。 → 0除算を防ぐ安全な書き方が可能になります。


08-9 演習問題(演算子)

問題1:複合代入

以下のプログラムを完成させ、正しい計算結果を出力しなさい。

int a = 4;
a *= 2;
a -= 1;
printf("a = %d\n", a);

正解と解説 a = 4 * 2 = 8
a = 8 - 1 = 7 出力:a = 7

問題2:前置・後置の違い

以下の出力はどうなる?

int x = 5;
int y = x++;
printf("x = %d, y = %d\n", x, y);

正解と解説 後置インクリメントなので、yに代入した後でxが増える → x = 6, y = 5

問題3:短絡評価

以下のコードは安全な記述になっているか?理由も述べよ。

if (x != 0 && 100 / x > 1) {
    printf("OK\n");
}

正解と解説 x != 0 が偽のとき、100 / x は評価されない。よって0除算を防げており、安全な書き方である。