四則演算・剰余・演算の優先順位を学ぶ。
特に整数の割り算と剰余は C言語特有の挙動があるため注意。
この章のコードでは、計算結果を画面に表示するために printf を使う。
printf の詳細は 07_標準出力 で学ぶ。今は次の2点だけ覚えておけばよい。
printf("表示したい文字列¥n"); ← 文字列をそのまま表示するprintf("x = %d¥n", x); ← %d の位置に整数変数 x の値が入る¥n は改行を意味する。%d は整数を表示するための目印(書式指定子)。
| 演算子 | 意味 | 例 | 結果 |
|---|---|---|---|
+ | 加算 | 15 + 4 | 19 |
- | 減算 | 15 - 4 | 11 |
* | 乗算 | 15 * 4 | 60 |
/ | 除算 | 15 / 4 | 3 ※小数切り捨て |
% | 剰余(余り) | 15 % 4 | 3 |
/ は小数点以下を切り捨てる。7 / 2 は 3.5 ではなく 3 になる。これは頻出バグの原因。
次のファイルを新規作成して入力し、実行してみよう。
#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 の中で % を文字として表示したいときは %% と書く。% 単体では書式指定子の開始として解釈されてしまう。
%)の使い道剰余は「割った余り」を返す演算子で、実際のプログラムでよく使う。
| 用途 | コード例 | 判定 |
|---|---|---|
| 偶数・奇数の判定 | n % 2 == 0 | 0 なら偶数、1 なら奇数 |
| 3の倍数か判定 | n % 3 == 0 | 0 なら 3 の倍数 |
| 循環するインデックス | i % 配列サイズ | 範囲を超えたら最初に戻る |
| 優先度 | 演算子 | 説明 |
|---|---|---|
| 高 | () | カッコの中を先に計算 |
| ↑ | * / % | 乗算・除算・剰余 |
| ↓ | + - | 加算・減算 |
| 低 | = | 代入(最後に行われる) |
次のファイルで優先順位の違いを確認しよう。
#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
既に書いた2つのファイルをベースに、値や式を変えて動作を確認しよう。
05_02_priority.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));
整数をゼロで割ると何が起きるか、実際に試してみよう。
#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.c の a と b の値をいろいろ変えて、
整数除算の切り捨てが起きる組み合わせを探してみよう。
int a = 7; /* ← 変えて試す */
int b = 2; /* ← 変えて試す */
| a | b | a / b | 切り捨て |
|---|---|---|---|
| 7 | 2 | 3 | あり(3.5 → 3) |
| 9 | 3 | 3 | なし(割り切れる) |
| 10 | 4 | 2 | あり(2.5 → 2) |
| -7 | 2 | -3 | あり(-3.5 → -3、ゼロ方向へ切り捨て) |
負の数の割り算は「ゼロ方向への切り捨て」になる点に注意(-3.5 は -4 ではなく -3 になる)。
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 = 6、4 / 2 = 2 → 1 + 6 - 2 = 5
Q4. printf の中で % を文字として出力するにはどう書くか。
正解:イ
printf では % が書式指定子の開始文字として使われるため、
文字としての % を出力したいときは %% と書く。
| ポイント | 内容 |
|---|---|
| 算術演算子 | + - * / % の 5 種類 |
| 整数の割り算 | 小数点以下は切り捨て。7 / 2 = 3 |
| 剰余 | 余りを返す。偶奇判定などに活用 |
| 優先順位 | * / % → + - の順。迷ったら () で明示 |
%% | printf 内で % 文字を出力するときの書き方 |