C言語では、値を計算する場面がとても多くあります。
特に四則演算(+ – * /)と剰余(%)は、変数の計算や条件分岐、ループ処理など、あらゆる場面で登場します。
本記事では、C言語初心者の方を対象に、これらの演算子の基本から、注意点や実用的な使い方、ミニ電卓プログラムまで、具体的なサンプルコードを交えながら丁寧に解説していきます。
C言語の四則演算とは
C言語で使う演算子(+ – * / %)の基本
C言語には、数値に対して計算を行うための算術演算子が用意されています。
代表的なものが、いわゆる四則演算と剰余です。
以下の表は、よく使う演算子と意味をまとめたものです。
| 演算子 | 名前 | 主な役割 | 例 |
|---|---|---|---|
| + | 加算演算子 | 左右の値を足し算する | a + b |
| – | 減算演算子 | 左右の値を引き算する | a – b |
| * | 乗算演算子 | 左右の値を掛け算する | a * b |
| / | 除算演算子 | 左右の値を割り算する | a / b |
| % | 剰余演算子 | 割り算の余りを求める | a % b |
これらの演算子は、整数型(int)や浮動小数点型(doubleなど)の値を計算するために使用します。
ただし、%演算子は整数型でしか使えないという制限があるため、後ほど詳しく説明します。
四則演算と代入演算子(=)の違い
初心者が最初につまずきやすいポイントとして、四則演算子と代入演算子の違いがあります。
- = は「代入演算子」であり、「右側の値を左側の変数に入れる」という意味です。
- + や – などは「算術演算子」であり、「値を計算する」という役割です。
例えば、次のようなコードを見てみます。
#include <stdio.h>
int main(void) {
int a = 5; // 変数aを宣言し、5を代入する
int b = 3; // 変数bを宣言し、3を代入する
int c;
c = a + b; // a + b を計算し、その結果をcに「代入」する
printf("a = %d\n", a);
printf("b = %d\n", b);
printf("c = a + b の結果は %d です\n", c);
return 0;
}
a = 5
b = 3
c = a + b の結果は 8 です
ここで重要なのは、a + b は「式」であり、その結果を = によってcへ代入するという流れです。
a = a + 1;のような書き方も同じ考え方で、右側をまず計算してから左に代入しています。
計算結果の型(int型・double型)に注意
C言語では、演算結果の「型」がとても重要です。
整数同士を計算すると整数になり、小数を含む型を使うと小数の結果が得られます。
代表的な型は次のようになります。
| 型名 | 主な用途 | 例 |
|---|---|---|
| int | 整数(小数点を持たない値) | 1, -3, 100 |
| double | 倍精度小数(浮動小数点数) | 3.14, -0.5, 2.0 |
整数同士の割り算は、小数点以下が切り捨てられます。
この点が特に重要です。
#include <stdio.h>
int main(void) {
int a = 7;
int b = 2;
int int_result = a / b; // 整数どうしの割り算
double dbl_result1 = a / b; // 結果をdoubleに代入しているが、計算は整数どうし
double dbl_result2 = (double)a / b; // 片方をdoubleに変換してから計算
printf("int_result = %d\n", int_result);
printf("dbl_result1 = %f (整数どうしの計算後にdoubleへ)\n", dbl_result1);
printf("dbl_result2 = %f (doubleを含む計算)\n", dbl_result2);
return 0;
}
int_result = 3
dbl_result1 = 3.000000 (整数どうしの結果3がdoubleに変換)
dbl_result2 = 3.500000 (doubleを含む計算で3.5になる)
このように、どの型どうしで計算するかによって結果が変わるため、特に割り算では型に注意する必要があります。
C言語のたし算・ひき算
+演算子(加算)の書き方とサンプルコード
+演算子は、2つの値を足し算するために使います。
整数どうしだけでなく、doubleなどの小数も足し算できます。
#include <stdio.h>
int main(void) {
int x = 10;
int y = 20;
int sum_int = x + y; // 整数どうしの加算
double a = 1.5;
double b = 2.3;
double sum_double = a + b; // 小数どうしの加算
printf("x + y = %d\n", sum_int);
printf("a + b = %f\n", sum_double);
return 0;
}
x + y = 30
a + b = 3.800000
このように、変数同士だけでなく、リテラル(数値そのもの)との加算も可能です。
例えばx + 5や10 + 20 + 30といった式も書けます。
-演算子(減算)の書き方とサンプルコード
-演算子は、引き算を行う演算子です。
足し算と同様に、整数や小数で使用できます。
#include <stdio.h>
int main(void) {
int x = 10;
int y = 3;
int diff_int = x - y; // 整数どうしの減算
double a = 5.5;
double b = 2.2;
double diff_double = a - b; // 小数どうしの減算
printf("x - y = %d\n", diff_int);
printf("a - b = %f\n", diff_double);
return 0;
}
x - y = 7
a - b = 3.300000
減算も、右側の値を左側の値から引くというシンプルなルールです。
ただし、結果がマイナスになる場合もあるので、符号付きの整数の扱いを理解しておく必要があります。
符号付き整数と負の値の計算ルール
C言語のint型は通常「符号付き整数」です。
つまり、正の数・0・負の数を表現できます。
負の値を扱うときには、次のような点を理解しておくと安心です。
- 単項マイナスとしての
-xは、「xにマイナスを付ける」という意味になります。 - 減算の
a - bは、「aに(マイナスのb)を足す」イメージで捉えることもできます。
#include <stdio.h>
int main(void) {
int a = 5;
int b = -3; // 負の値を代入
int c = a + b; // 5 + (-3)
int d = a - b; // 5 - (-3)
int e = -a; // a に単項マイナスを付ける
printf("a = %d\n", a);
printf("b = %d\n", b);
printf("a + b = %d\n", c); // 5 + (-3) = 2
printf("a - b = %d\n", d); // 5 - (-3) = 8
printf("-a = %d\n", e); // -5
return 0;
}
a = 5
b = -3
a + b = 2
a - b = 8
-a = -5
この例から分かるように、引き算は「マイナスの値を足す計算」と読み替えることもできます。
負の数が出てきても、足し算と引き算の関係を意識すると理解しやすくなります。
C言語のかけ算・わり算・剰余
*演算子(乗算)の基本とよくあるミス
*演算子は、2つの値を掛け算するために使います。
#include <stdio.h>
int main(void) {
int x = 4;
int y = 7;
int mul_int = x * y; // 整数どうしの掛け算
double a = 1.5;
double b = 2.0;
double mul_double = a * b; // 小数どうしの掛け算
printf("x * y = %d\n", mul_int);
printf("a * b = %f\n", mul_double);
return 0;
}
x * y = 28
a * b = 3.000000
よくあるミスとして、掛け算をx(かける)や·では書けないという点があります。
C言語では、必ず*を使います。
また、掛け算にはオーバーフローの危険もあります。
非常に大きな数どうしをintで掛けると、結果がintの範囲を超えてしまい、正しくない値になることがあります。
初心者の段階では、「あまり大きな値の掛け算は危険かもしれない」と意識しておくと良いです。
/演算子(除算)と整数の割り算に注意
/演算子は割り算を行います。
ここで特に重要なのが、整数どうしの割り算は小数点以下が切り捨てられるというルールです。
#include <stdio.h>
int main(void) {
int a = 7;
int b = 3;
int div_int = a / b; // 整数どうしの割り算
printf("a / b (int) = %d\n", div_int);
return 0;
}
a / b (int) = 2
7 ÷ 3 は本来 2.333… ですが、intどうしの割り算では2になります。
これは小数点以下を「四捨五入」するのではなく切り捨てである点が非常に重要です。
分数の結果を正しく扱いたい場合は、後述するようにdouble型を使う必要があります。
小数の割り算(double型)での/の動き
小数(浮動小数点数)を扱う場合にはdouble型などを使います。
double型を含む計算では、小数点付きの結果が得られます。
#include <stdio.h>
int main(void) {
int a = 7;
int b = 3;
double r1 = a / b; // 整数どうしで計算 → 結果(2)がdoubleへ
double r2 = (double)a / b; // 片方をdoubleにキャストしてから計算
double r3 = 7.0 / 3.0; // 最初からdoubleリテラルどうし
printf("a / b (int計算後) = %f\n", r1);
printf("(double)a / b = %f\n", r2);
printf("7.0 / 3.0 (double同士) = %f\n", r3);
return 0;
}
a / b (int計算後) = 2.000000
(double)a / b = 2.333333
7.0 / 3.0 (double同士) = 2.333333
ここでのポイントは、「どのタイミングでdoubleとして計算されるか」です。
r1は、まず整数どうしで割り算が行われて2になり、その後doubleへ変換されます。r2やr3は、計算の時点でdoubleを含んでいるため、小数点付きの結果になります。
この違いを理解すると、意図しない「2.000000」という結果を防ぐことができます。
%演算子(剰余)とは?余りの意味とルール
%演算子は、剰余(じょうよ)を求めるための演算子で、割り算の「余り」を計算します。
例えば、7 ÷ 3 は 2 余り 1 なので、7 % 3の結果は1になります。
#include <stdio.h>
int main(void) {
int a = 7;
int b = 3;
int q = a / b; // 商
int r = a % b; // 余り
printf("a = %d, b = %d\n", a, b);
printf("a / b (商) = %d\n", q);
printf("a %% b (余り) = %d\n", r);
return 0;
}
a = 7, b = 3
a / b (商) = 2
a % b (余り) = 1
C言語では、剰余演算は次のような性質を持ちます。
a = (b * (a / b)) + (a % b)という関係が成り立つ(一部の例外をのぞきますが、基本的な整数ではこのイメージでOKです)。- 余りの結果は、割られる数(左側)と同じ符号になるという仕様があります(負の数を扱う場合は処理系依存の部分もあるため、初心者のうちは負での%はあまり使わない方が安全です)。
%が使える型(intだけ)と使えない型
%演算子は整数専用であり、double型などの小数では使えません。
使える代表的な型は次の通りです。
| 使える型(例) | 説明 |
|---|---|
| int | 一般的な整数 |
| long, long long | より大きな整数 |
| short | より小さな整数 |
| char(数値扱い時) | 文字コードなどの整数 |
一方、次のような型には使えません。
| 使えない型(例) | 説明 |
|---|---|
| float | 単精度浮動小数型 |
| double | 倍精度浮動小数型 |
例えば、次のようなコードはコンパイルエラーになります。
#include <stdio.h>
int main(void) {
double a = 5.0;
double b = 2.0;
// doubleどうしの%はエラーになる
// double r = a % b; // これはコンパイルエラー
printf("このプログラムは%%演算子のエラー例を示すだけです。\n");
return 0;
}
%cst-strong>小数で「余り」を求めたい場合は、別の方法(整数に変換してから%を使う、または数学関数を使うなど)が必要です。
ただし、初心者の段階では、「%はintなどの整数専用」と覚えておけば十分です。
四則演算と剰余の応用例
演算子の優先順位と()の使い方
C言語では、演算子には「優先順位」があります。
特に四則演算では、次の順序で計算されます。
| 優先順位(高い順) | 演算子 | 備考 |
|---|---|---|
| 1 | * / % | 左から右へ計算 |
| 2 | + – | 左から右へ計算 |
例えば、1 + 2 * 3という式は、2 * 3 が先に計算されてから、1を足すので、結果は7になります。
#include <stdio.h>
int main(void) {
int a = 1 + 2 * 3; // 2 * 3 が先
int b = (1 + 2) * 3; // ()で足し算を優先
int c = 10 - 4 / 2; // 4 / 2 が先
int d = (10 - 4) / 2; // ()で引き算を優先
printf("1 + 2 * 3 = %d\n", a);
printf("(1 + 2) * 3 = %d\n", b);
printf("10 - 4 / 2 = %d\n", c);
printf("(10 - 4) / 2 = %d\n", d);
return 0;
}
1 + 2 * 3 = 7
(1 + 2) * 3 = 9
10 - 4 / 2 = 8
(10 - 4) / 2 = 3
コードを読みやすくし、意図通りに計算させるために、積極的に()を使うことをおすすめします。
コンパイラは優先順位を理解していますが、人間が読みやすいように書くことがとても重要です。
インクリメント(++), デクリメント(–)との違い
四則演算とよく一緒に登場するのが、インクリメント(++), デクリメント(–)です。
i++や++iは、変数iを1増やします。i--や--iは、変数iを1減らします。
これらは、次のような式の省略形と考えられます。
i = i + 1;→i++;または++i;i = i - 1;→i--;または--i;
#include <stdio.h>
int main(void) {
int i = 5;
printf("初期値 i = %d\n", i);
i = i + 1; // 1加算
printf("i = i + 1; の後 i = %d\n", i);
i++; // インクリメント
printf("i++; の後 i = %d\n", i);
i--; // デクリメント
printf("i--; の後 i = %d\n", i);
// 前置と後置の違い(少し応用)
int a = 10;
int b = a++; // b に代入した後でaを1増やす
int c = ++a; // aを1増やしてからcに代入する
printf("a++ の結果: a = %d, b = %d\n", a, b);
printf("++a の結果: a = %d, c = %d\n", a, c);
return 0;
}
初期値 i = 5
i = i + 1; の後 i = 6
i++; の後 i = 7
i--; の後 i = 6
a++ の結果: a = 12, b = 10
++a の結果: a = 13, c = 13
前置(++i)と後置(i++)の違いは少し難しいですが、最初のうちは「1増える」「1減る」という動きだけ理解していれば十分です。
ループ処理などで頻繁に使われます。
%を使った偶数判定・周期処理の書き方
%cst-strong>%演算子は「余り」を求めるため、特に「周期性」を扱う処理に強力です。
代表的な例が偶数・奇数の判定です。
整数が偶数かどうかは、「2で割った余りが0かどうか」で判定できます。
#include <stdio.h>
int main(void) {
int n;
printf("整数を入力してください: ");
scanf("%d", &n);
if (n % 2 == 0) { // 2で割った余りが0なら偶数
printf("%d は偶数です。\n", n);
} else {
printf("%d は奇数です。\n", n);
}
return 0;
}
整数を入力してください: 10
10 は偶数です。
さらに、%演算子は「一定の周期で何かを行う」処理にも使えます。
例えば、「3回ごとにメッセージを表示する」などです。
#include <stdio.h>
int main(void) {
int i;
for (i = 1; i <= 10; i++) {
printf("%d 回目の処理です。\n", i);
// 3回ごとにメッセージ
if (i % 3 == 0) {
printf(" → これは3の倍数のタイミングです。\n");
}
}
return 0;
}
1 回目の処理です。
2 回目の処理です。
3 回目の処理です。
→ これは3の倍数のタイミングです。
4 回目の処理です。
5 回目の処理です。
6 回目の処理です。
→ これは3の倍数のタイミングです。
7 回目の処理です。
8 回目の処理です。
9 回目の処理です。
→ これは3の倍数のタイミングです。
10 回目の処理です。
このように、%演算子は条件分岐と組み合わせることで、さまざまなパターンの処理に応用できます。
四則演算と剰余で作るミニ電卓プログラム
最後に、四則演算と剰余を使った簡単なミニ電卓プログラムを作ってみます。
ユーザーから2つの整数と、演算子(+, -, *, /, %)を1文字入力してもらい、その結果を表示します。
#include <stdio.h>
int main(void) {
int a, b;
char op; // 演算子を1文字で受け取る
printf("1つ目の整数を入力してください: ");
scanf("%d", &a);
printf("2つ目の整数を入力してください: ");
scanf("%d", &b);
// 改行などを消費するために、一度スペースを空けてから読み込む
printf("演算子を入力してください (+, -, *, /, %%): ");
scanf(" %c", &op); // 先頭にスペースを入れて余計な改行をスキップ
int result_int; // int型の結果用
double result_double; // double型の結果用(割り算に使用)
if (op == '+') {
result_int = a + b;
printf("%d + %d = %d\n", a, b, result_int);
} else if (op == '-') {
result_int = a - b;
printf("%d - %d = %d\n", a, b, result_int);
} else if (op == '*') {
result_int = a * b;
printf("%d * %d = %d\n", a, b, result_int);
} else if (op == '/') {
if (b == 0) {
// 0で割ることはできないのでエラーメッセージ
printf("<mark style="background-color:rgba(0, 0, 0, 0);color:#cf2e2e" class="has-inline-color"><strong>エラー: 0で割ることはできません。</strong></mark>\n");
} else {
// double型で計算し、小数も表示できるようにする
result_double = (double)a / b;
printf("%d / %d = %f\n", a, b, result_double);
}
} else if (op == '%') {
if (b == 0) {
printf("<mark style="background-color:rgba(0, 0, 0, 0);color:#cf2e2e" class="has-inline-color"><strong>エラー: 0で割ることはできません。</strong></mark>\n");
} else {
result_int = a % b;
printf("%d %% %d = %d\n", a, b, result_int);
}
} else {
printf("対応していない演算子です: %c\n", op);
}
return 0;
}
1つ目の整数を入力してください: 10
2つ目の整数を入力してください: 3
演算子を入力してください (+, -, *, /, %): /
10 / 3 = 3.333333
このミニ電卓では、次のポイントを確認できます。
- +, -, *, %, / の基本的な使い方
- 0で割ることはできないため、事前にチェックしていること
- 割り算の時にdouble型を用いて小数まで表示していること
- %で余りを計算していること
このような小さなプログラムを自分で書いて動かしてみることで、四則演算と剰余に対する理解が一気に深まります。
まとめ
C言語の四則演算(+ – * /)と剰余(%)は、どのプログラムでも使われる非常に重要な基礎です。
整数と小数では計算の結果や扱いが異なり、特に整数どうしの割り算は小数点以下が切り捨てになる点に注意が必要です。
また、%は整数専用であり、偶数判定や周期処理など、多くの実用的な場面で活躍します。
この記事で紹介したサンプルコードやミニ電卓を参考にしながら、自分でもいろいろな計算式を試し、C言語での数値計算に慣れていくことをおすすめします。
