05 演算子(基礎)

四則演算・剰余・演算の優先順位を学ぶ。
特に整数の割り算と剰余は C言語特有の挙動があるため注意。


05-0 この章で使う「画面出力」について

この章のコードでは、計算結果を画面に表示するために printf を使う。
printf の詳細は 07_標準出力 で学ぶ。今は次の2点だけ覚えておけばよい。

📋 今の時点で知っておくこと(詳細は07で学ぶ)

printf("表示したい文字列¥n"); ← 文字列をそのまま表示する
printf("x = %d¥n", x);%d の位置に整数変数 x の値が入る

¥n は改行を意味する。%d は整数を表示するための目印(書式指定子)。

05-1 算術演算子

演算子意味結果
+加算15 + 419
-減算15 - 411
*乗算15 * 460
/除算15 / 43 ※小数切り捨て
%剰余(余り)15 % 43
整数型同士の / は小数点以下を切り捨てる。
7 / 23.5 ではなく 3 になる。これは頻出バグの原因。

05-2 実行例:四則演算

次のファイルを新規作成して入力し、実行してみよう。

05_01_arithmetic.c
#include <stdio.h>

int main(void)
{
    int a = 15;
    int b = 4;

    printf("a + b = %d¥n", a + b);
    printf("a - b = %d¥n", a - b);
    printf("a * b = %d¥n", a * b);
    printf("a / b = %d¥n", a / b);   /* 小数切り捨て */
    printf("a %% b = %d¥n", a % b);  /* %% で % を表示 */

    return 0;
}

実行結果:

a + b = 19
a - b = 11
a * b = 60
a / b = 3
a % b = 3
printf の中で % を文字として表示したいときは %% と書く。
% 単体では書式指定子の開始として解釈されてしまう。

05-3 剰余(%)の使い道

剰余は「割った余り」を返す演算子で、実際のプログラムでよく使う。

用途コード例判定
偶数・奇数の判定n % 2 == 00 なら偶数、1 なら奇数
3の倍数か判定n % 3 == 00 なら 3 の倍数
循環するインデックスi % 配列サイズ範囲を超えたら最初に戻る

05-4 演算の優先順位

優先度演算子説明
()カッコの中を先に計算
* / %乗算・除算・剰余
+ -加算・減算
=代入(最後に行われる)

次のファイルで優先順位の違いを確認しよう。

05_02_priority.c
#include <stdio.h>

int main(void)
{
    int a = 2 + 3 * 4;      /* 3*4=12 → 2+12=14 */
    int b = (2 + 3) * 4;    /* 2+3=5  → 5*4=20  */

    printf("2 + 3 * 4   = %d¥n", a);
    printf("(2 + 3) * 4 = %d¥n", b);

    return 0;
}
2 + 3 * 4   = 14
(2 + 3) * 4 = 20
✅ 優先順位を覚えきれないうちは、カッコを積極的に使って意図を明確にするとよい。

05-5 演習:変えて試してみよう

既に書いた2つのファイルをベースに、値や式を変えて動作を確認しよう。

🔧 演習① カッコで結果がどう変わるか確認しよう

05_02_priority.c を参考に、次のファイルを新規作成して実行しよう。
カッコの位置を変えると結果がどう変わるか確認すること。

05_03_paren.c
#include <stdio.h>

int main(void)
{
    /* カッコなし */
    printf("10 + 4 * 3     = %d¥n", 10 + 4 * 3);

    /* カッコで優先順位を変える */
    printf("(10 + 4) * 3   = %d¥n", (10 + 4) * 3);
    printf("10 + (4 * 3)   = %d¥n", 10 + (4 * 3));   /* カッコなしと同じ結果になる */
    printf("(10 + 4) * (3) = %d¥n", (10 + 4) * (3));

    return 0;
}
10 + 4 * 3     = 22
(10 + 4) * 3   = 42
10 + (4 * 3)   = 22
(10 + 4) * (3) = 42

さらに自分で式を変えて試してみよう。たとえば:

printf("(2 + 3) * (4 - 1) = %d¥n", (2 + 3) * (4 - 1));
⚠️ 演習② ゼロで割るとどうなるか確認しよう

整数をゼロで割ると何が起きるか、実際に試してみよう。

05_04_divzero.c
#include <stdio.h>

int main(void)
{
    int a = 10;
    int b = 0;

    printf("a / b = %d¥n", a / b);   /* ゼロ除算 */
    printf("a %% b = %d¥n", a % b);  /* ゼロによる剰余 */

    return 0;
}
実行するとどうなるか(先に予想してから開こう)

Visual Studio では実行時に次のようなエラーが発生してプログラムが止まる:

0xC0000094 の例外がスローされました(整数除算)

これは実行時エラー(ランタイムエラー)と呼ぶ。
コンパイルは通るが、実行した瞬間にプログラムが異常終了する

コンパイルエラー(文法の間違い)とは違い、実行してみないと発生しない点に注意。
実際のプログラムでは「割る数がゼロでないか」を事前に確認する必要がある(if文を学んだ後で扱う)。

b = 0 のまま実行するとプログラムが強制終了する。
確認したら b の値を 0 以外に戻してから次の演習に進むこと。
🔧 演習③ 整数の割り算で小数が消えることを体験しよう

05_01_arithmetic.cab の値をいろいろ変えて、
整数除算の切り捨てが起きる組み合わせを探してみよう。

int a = 7;   /* ← 変えて試す */
int b = 2;   /* ← 変えて試す */
切り捨てが起きる・起きないパターン
aba / b切り捨て
723あり(3.5 → 3)
933なし(割り切れる)
1042あり(2.5 → 2)
-72-3あり(-3.5 → -3、ゼロ方向へ切り捨て)

負の数の割り算は「ゼロ方向への切り捨て」になる点に注意(-3.5 は -4 ではなく -3 になる)。


05-6 理解度チェック

Q1. int x = 7 / 2; の結果はどれか。

解説を表示

正解:ア

整数型同士の割り算は小数点以下を切り捨てた整数になる。
7 / 2 = 3.5 → 切り捨てて 3

Q2. 10 % 3 の結果はどれか。

解説を表示

正解:ア

10 ÷ 3 = 3 余り 1 なので、剰余は 1

Q3. 次の式の計算結果はどれか。

int result = 1 + 2 * 3 - 4 / 2;
解説を表示

正解:イ

乗除を先に計算する。
2 * 3 = 64 / 2 = 21 + 6 - 2 = 5

Q4. printf の中で % を文字として出力するにはどう書くか。

解説を表示

正解:イ

printf では % が書式指定子の開始文字として使われるため、
文字としての % を出力したいときは %% と書く。


05-7 まとめ

ポイント内容
算術演算子+ - * / % の 5 種類
整数の割り算小数点以下は切り捨て。7 / 2 = 3
剰余余りを返す。偶奇判定などに活用
優先順位* / %+ - の順。迷ったら () で明示
%%printf 内で % 文字を出力するときの書き方