1. はじめに
C言語は初心者からプロまで幅広い開発者に利用される、基本的で強力なプログラミング言語です。その中で「剰余演算子(%)」は、プログラムを効率的に書くために欠かせない重要な要素です。本記事では、C言語の剰余演算子の基礎から応用、注意点、さらにはよくある質問についても詳しく解説していきます。
2. C言語の剰余演算子(%)とは
剰余演算子の基本的な役割
C言語における剰余演算子(%)は、整数を除算した際に得られる「余り」を計算するための演算子です。例えば、「7 ÷ 3」を計算すると商が2で余りが1になります。この余りの部分を取得するのが剰余演算子です。
例:基本的な剰余計算
#include <stdio.h>
int main() {
printf("%d
", 7 % 3); // 出力: 1
return 0;
}
整数型への適用
剰余演算子は、整数型(int
型など)に対してのみ適用されます。浮動小数点数型(float
やdouble
)では直接使用できないため、計算が必要な場合は別途関数を利用します。
3. 剰余演算の具体例
正の整数同士の計算例
以下の例では、正の整数同士での剰余計算を示します。
#include <stdio.h>
int main() {
printf("%d
", 10 % 4); // 出力: 2
printf("%d
", 15 % 6); // 出力: 3
return 0;
}
解説:10を4で割ると商が2、余りが2。同様に15を6で割ると商が2、余りが3になります。
負の数を含む場合の挙動
C言語では、剰余演算の結果の符号は被除数(分子)の符号に依存します。
#include <stdio.h>
int main() {
printf("%d
", -7 % 3); // 出力: -1
printf("%d
", 7 % -3); // 出力: 1
return 0;
}
解説:-7 % 3
の場合、被除数が負のため余りも負の値になります。
他言語との違い
PythonやJavaScriptでは、剰余演算の結果が除数(分母)の符号に依存する場合があります。この挙動の違いは、異なる言語間でプログラムを移植する際に注意が必要です。

4. 剰余演算の注意点
負の数の挙動と規則性
剰余演算における符号の扱いは、プログラムの挙動を正確に理解する上で重要です。負の数を扱う際は、常に被除数の符号を確認するようにしましょう。
ゼロによる剰余演算のエラー
C言語では、除数がゼロの場合、剰余演算は未定義の動作になります。この場合、実行時エラーやプログラムの異常終了が発生するため、計算前にゼロチェックを行うことが重要です。
if (denominator == 0) {
printf("除数はゼロにできません。
");
} else {
printf("%d
", numerator % denominator);
}
浮動小数点型での制限
浮動小数点数で剰余演算を行いたい場合、fmod
関数を使用します。
#include <math.h>
#include <stdio.h>
int main() {
printf("%.2f
", fmod(7.5, 3.0)); // 出力: 1.50
return 0;
}
5. 剰余演算の応用例
配列の循環処理
剰余演算は配列のインデックスを循環させる際に役立ちます。以下は配列末尾から先頭に戻る処理の例です。
#include <stdio.h>
int main() {
int arr[] = {10, 20, 30};
int n = 3; // 配列の要素数
for (int i = 0; i < 10; i++) {
printf("%d
", arr[i % n]);
}
return 0;
}
偶数・奇数の判定
数値が偶数か奇数かを判定する際にも剰余演算を使用します。
if (x % 2 == 0) {
printf("偶数です
");
} else {
printf("奇数です
");
}
6. FAQ(よくある質問)
Q1: 負の数を含む場合、剰余結果の符号はどうなりますか?
A1: C言語では被除数の符号に依存します。
Q2: 浮動小数点数で剰余演算を行いたい場合は?
A2: fmod
関数を使用してください。
Q3: 剰余演算でエラーが発生する場合の原因は?
A3: 主に「除数がゼロ」でのエラーや「型の不一致」が挙げられます。
Q4: 剰余演算を使った効率的なアルゴリズムの例は?
A4: 配列の循環処理やハッシュテーブルのインデックス計算が代表例です。
7. まとめ
剰余演算は、C言語のプログラミングにおいて基本的かつ強力なツールです。本記事では、基礎から応用、注意点、FAQまで包括的に解説しました。剰余演算の特性を正しく理解し、適切に活用することで、より効率的なプログラムを作成できるようになります。