📦 変数・型・演算子
🎯 整数どうしの割り算が切り捨てになる理由を理解し、平均計算などで正しく対処できる
ここは初心者が踏む地雷の中でも、特に命中率の高い場所です。落ち着いて一度体験しておけば、二度と踏みません。
7 ÷ 2 は 3 になる
#include <stdio.h>
int main(void) {
int a = 7;
int b = 2;
printf("%d\n", a / b);
printf("%d\n", a % b);
return 0;
}出力は 3 と 1 です。整数どうしの / は小数点以下を切り捨てた整数を返します。3.5 が四捨五入されて4になるのではなく、容赦なく3。そして % が余りの1を返します。
7 = 2 * 3 + 1。商と余りに分ける、小学校の割り算そのものです。
事件——平均点が合わない
#include <stdio.h>
int main(void) {
int goukei = 173;
int ninzuu = 4;
double heikin = goukei / ninzuu; // 事件現場
printf("平均 %.2f\n", heikin);
return 0;
}期待は 43.25、実際の出力は 平均 43.00 です。原因は代入より前にあります。goukei / ninzuu の時点で両方とも整数なので整数の割り算が行われ、43 になってから double に入っている。受け皿を double にしても、こぼれた後では遅いのです。
対処は、割る前にどちらかを小数の世界へ移すこと。
・(double)goukei / ninzuu … キャストで明示的に変換する
・goukei / 4.0 … 定数なら小数で書く
% の使いどころ
・偶数か奇数か … n % 2 が0なら偶数
・倍数の判定 … n % 3 == 0 なら3の倍数
・桁の取り出し … n % 10 で一の位、n / 10 で残り
・単位の変換 … 200分なら 200 / 60 時間と 200 % 60 分
#include <stdio.h>
int main(void) {
int fun = 200;
printf("%d時間%d分\n", fun / 60, fun % 60);
return 0;
}出力は 3時間20分。整数の割り算は欠陥ではなく、使いどころのある道具です。
罠・注意
負の数は0の方向へ切り捨て。 -7 / 2 は -3(-3.5 が -4 ではなく -3)、-7 % 2 は -1 です。C99以降、この動きが標準で決まっています。
0で割ると異常終了。 / も % も同じです。割る前に確認します。
片方が小数なら全体が小数。 7 / 2.0 は 3.5 です。定数なら 2.0 と書くだけで直ります。
まとめ
整数どうしの / は切り捨て、% は余り。受け皿を double にしても、計算の時点が整数なら手遅れです。(double) を割られる側に付けるか、定数を 2.0 と書きます。負の数は0方向へ切り捨て、0除算は事故です。
(int)や(double)のように型名を()で書いて、値を別の型へ明示的に変換すること。意図をはっきり示して事故を防ぐための書き方。int同士の割り算を小数で得たいときなど、意図的に型を変えたい場面で使う。
+や-、==など、値どうしを計算したり比較したりするための記号のこと。演算子ごとに計算される優先順位があらかじめ決まっている。+ - * / のような算術演算子のほか、比較や論理の演算子も含まれる。
小数を含む数値を扱うための型のこと。floatより広い範囲と高い精度を持ち、実数計算における標準的な選択肢として使われる。小数点以下の桁数が多い計算でも、比較的高い精度を保てるのが特徴。
もっと先へ:ポインタ・メモリ・ファイル入出力・セキュアコーディングを含む全26トラックと、段位検定・模試のフルセットは完全版に収録しています。