C言語でプログラムを書いていると、変数の値を少しずつ増やしたり減らしたりする場面がとても多くあります。
そのたびにa = a + 1のように書くのは面倒ですし、コードも読みにくくなってしまいます。
そこで登場するのが便利な代入演算子(複合代入演算子)です。
本記事では、+=、-=、*=、/=の基本から、初心者がつまずきやすい注意点、実用的な練習例まで、順番にやさしく解説します。
代入演算子(+=, -=, *=, /=)とは【C言語の基本】
代入演算子とは何か
C言語の代入演算子とは、変数に値を代入するための演算子のことです。
もっとも基本的な代入演算子は=で、次のように使います。
int a = 10;
「変数aに10を代入する」という意味になります。
ここから一歩進んだものが複合代入演算子です。
これは、
変数 = 変数 演算 値;
という形の式を、より短く書けるようにした演算子です。
代表的なものは次の4つです。
+=(加算して代入)-=(減算して代入)*=(乗算して代入)/=(除算して代入)
これらをまとめて複合代入演算子と呼びます。
| 複合代入演算子 | 意味(展開形) | 説明 |
|---|---|---|
+= | a = a + b; | aにbを足して、その結果をaに代入 |
-= | a = a - b; | aからbを引いて、その結果をaに代入 |
*= | a = a * b; | aにbを掛けて、その結果をaに代入 |
/= | a = a / b; | aをbで割って、その結果をaに代入 |
ポイントは「自分自身の値を使って更新する」時に使う演算子だ、ということです。
なぜ「a = a + 1」を「a += 1」と書くのか
例えば、次の2つのコードは意味としては同じです。
a = a + 1;
a += 1;
では、なぜわざわざ+=を使うのでしょうか。
主な理由は次の3つです。
- コードが短くなり、読みやすくなるから
- 「aに1を足す」という意図が一目で伝わるから
- 複雑な式の中で、変数名の重複を減らせるから
コードは短ければ良いというわけではありませんが、C言語ではよく使われる書き方に合わせることも大切です。
多くのCプログラムでは+=などの複合代入演算子が自然に使われているので、早めに慣れておくと他人のコードがぐっと読みやすくなります。
初心者が知っておきたいメリット
C言語初心者にとって、複合代入演算子を使うメリットは次のようにまとめられます。
1つめはタイピング量が減ることです。
例えばループで何度もsum = sum + x;と書くより、sum += x;と書いた方が手間が少なくなります。
2つめはバグが減りやすいことです。
a = a + b;と書くとき、初心者はa = b + b;のように誤って同じ変数を2回書いてしまうことがあります。
a += b;の形なら、こうしたタイプミスの可能性が少し下がります。
3つめは処理の意図がはっきりすることです。
+=は「足し込む」、-=は「引き下げる」といったニュアンスが強く、ループや累積計算のコードが直感的になります。
C言語の代表的な代入演算子の使い方
ここからは、それぞれの複合代入演算子の具体的な使い方を見ていきます。
まずは動くサンプルで雰囲気をつかんでみましょう。
+= 演算子の基本
+=は、変数に値を足し込むための演算子です。
#include <stdio.h>
int main(void) {
int a = 5;
// a = a + 3; と同じ意味です
a += 3;
printf("a の値は %d です\n", a); // 期待される表示: a の値は 8 です
return 0;
}
a の値は 8 です
この例では、最初にaを5で初期化し、その後a += 3;で3を足しています。
結果としてaは8になります。
ループで合計値を求めるときなど、+=は最もよく使われる複合代入演算子です。
-= 演算子の基本
-=は、変数から値を引くための演算子です。
#include <stdio.h>
int main(void) {
int hp = 100;
// hp = hp - 30; と同じ意味です
hp -= 30;
printf("残りHPは %d です\n", hp); // 期待される表示: 残りHPは 70 です
return 0;
}
残りHPは 70 です
ゲームのHP(体力)のような「値が減っていく量」を表すときに-=はよく使われます。
「現在の値を基準にして減らす」イメージを覚えておくと良いです。
*= 演算子の基本
*=は、変数に値を掛けるための演算子です。
#include <stdio.h>
int main(void) {
int price = 200;
// price = price * 3; と同じ意味です
price *= 3;
printf("合計金額は %d 円です\n", price); // 期待される表示: 合計金額は 600 円です
return 0;
}
合計金額は 600 円です
同じ金額の商品を複数個買うときや、倍率を掛けたいときに便利です。
また、繰り返し処理の中で指数的に増やしたい場合(2倍、3倍に増やしていくなど)にも使えます。
/= 演算子の基本
/=は、変数を値で割るための演算子です。
#include <stdio.h>
int main(void) {
int total = 100;
int people = 4;
// total = total / people; と同じ意味です
total /= people;
printf("1人あたり %d 個です\n", total); // 期待される表示: 1人あたり 25 個です
return 0;
}
1人あたり 25 個です
この例では、totalの値100を4で割っています。
ここでの注意点は、整数同士の割り算は小数点以下が切り捨てられるということです。
この点については「型に注意」の節で詳しく説明します。
それぞれの書き方と「a = a + b」との違い
もう一度、複合代入演算子と展開形の関係を整理しておきます。
| 複合代入の書き方 | 展開した書き方 | 説明 |
|---|---|---|
a += b; | a = a + b; | aにbを加算して、その結果をaに代入 |
a -= b; | a = a - b; | aからbを減算して、その結果をaに代入 |
a *= b; | a = a * b; | aにbを乗算して、その結果をaに代入 |
a /= b; | a = a / b; | aをbで除算して、その結果をaに代入 |
基本的な意味としては完全に同じですが、実際のコードでは次のような違いが現れます。
- 読みやすさ
sum += x;の方が、sum = sum + x;よりも「足し込んでいる」感じがはっきりします。 - 書き間違えにくさ
a = a + b;ではaを2回書く必要があるため、タイプミスが起きやすくなります。 - 複雑な式との組み合わせ
例えばa = a + (b * c - d);のような式では、そのままa += b * c - d;と書くことで変数名の重複を減らし、コードをすっきりさせることができます。
C言語初心者がつまずきやすいポイント
便利な代入演算子ですが、使い方を間違えると意図しない結果になることがあります。
ここでは初心者が特につまずきやすいポイントを整理します。
代入演算子とインクリメント(i++)の違い
C言語では+=のほかに、インクリメント演算子である++もよく使われます。
例えば次の2つは意味が同じです。
i += 1;i++;
ただし、++には前置演算子(++i)と後置演算子(i++)があり、式の評価順序が変わるというややこしい特徴があります。
一方でi += 1;は、式の結果として値を返さない単純な文として使うことが多く、分かりやすさという点では+=の方が初心者向きです。
次のコードを見てみましょう。
#include <stdio.h>
int main(void) {
int i = 5;
int a, b;
// 後置インクリメント: i の値を使った後に 1 増える
a = i++; // a には 5 が代入され、i は 6 になる
// += 演算子: まず i に 1 を足し、その後の値を代入
i += 1; // i は 7 になる
b = i; // b には 7 が代入される
printf("a = %d, b = %d, i = %d\n", a, b, i);
return 0;
}
a = 5, b = 7, i = 7
初心者のうちは、ループ変数を増やすだけならi += 1;と書いておく方が混乱が少なくなります。
型に注意
複合代入演算子は、変数の型によって結果が変わることがあります。
特に/=は要注意です。
#include <stdio.h>
int main(void) {
int a = 5;
int b = 2;
double x = 5.0;
double y = 2.0;
// 整数同士の除算
a /= b; // a = a / b; と同じ。5 / 2 は 2 (小数点以下切り捨て)
// 実数同士の除算
x /= y; // x = x / y; と同じ。5.0 / 2.0 は 2.5
printf("a = %d\n", a);
printf("x = %f\n", x);
return 0;
}
a = 2
x = 2.500000
整数型(intなど)どうしの割り算では小数点以下が必ず切り捨てられることに注意してください。
小数点以下も正確に扱いたいときは、変数をdoubleやfloatで宣言する必要があります。
また、*=や+=でも、桁あふれ(オーバーフロー)が起きる可能性があります。
例えばintで非常に大きな値を扱っていると、*=や+=を繰り返すうちに最大値を超えてしまう場合があります。
この場合の動作は環境依存であり、予測が難しくなります。
演算の順序とかっこの付け方に注意
複合代入演算子自体は単純ですが、右側に書く式の内容によっては、演算の順序を意識しなければならないことがあります。
例えば、次の2つの式は意味が異なります。
a += b * c; // a = a + (b * c);
a = (a + b) * c; // かっこを付けると全く別の計算になる
+=を使うときも「どの順番で計算されるか」を意識して、必要であればかっこを付けましょう。
もうひとつ、危険な書き方の例も見ておきます。
a += a * 2;
これはa = a + a * 2;と同じ意味で、aに対して2倍して、さらに元のaを足し込んでいることになります。
「aを2倍にする」つもりで書くと間違いになる典型例です。
「自分自身を右辺に出現させるとき」は、本当に意図した計算になっているか慎重に確認してください。
複合代入を多用しすぎないほうがよいケース
複合代入演算子は便利ですが、使いすぎると逆にコードが読みにくくなる場合があります。
例えば、次のようなコードを考えてみます。
total += price *= tax_rate;
これは一行で書けてしまいますが、意味を理解するのに少し時間がかかります。
priceにもtotalにも同時に影響しているため、バグを生みやすい書き方です。
同じ処理でも、次のように分けて書いた方が読みやすくなります。
price *= tax_rate; // price に税率を掛ける
total += price; // total に price を足し込む
このように、1行の中に複合代入をいくつも詰め込まないことが、分かりやすいコードを書くためのコツです。
特に初心者のうちは、一歩ずつ処理を分けて書くことを心がけるとよいでしょう。
代入演算子を練習しよう
ここからは、実際に手を動かして代入演算子を使いこなす練習をしていきます。
繰り返し処理や配列を使った例を通して、自然に+=などを使えるようになることを目指します。
繰り返し処理での +=, -= の実用例
まずはfor文と+=、-=を組み合わせた簡単な例です。
1から10までの合計と、10から1までの減算の流れを表示してみます。
#include <stdio.h>
int main(void) {
int i;
int sum = 0; // 合計値を入れる変数
int diff = 100; // 減算の結果を入れる変数
// 1 から 10 までの合計を求める
for (i = 1; i <= 10; i++) {
// sum = sum + i; と同じ
sum += i;
}
// 1 から 10 まで順に引いていく
for (i = 1; i <= 10; i++) {
// diff = diff - i; と同じ
diff -= i;
}
printf("1~10 の合計は %d です\n", sum);
printf("100 から 1~10 を順に引いた結果は %d です\n", diff);
return 0;
}
1~10 の合計は 55 です
100 から 1~10 を順に引いた結果は 45 です
ここでは、「ループのたびに少しずつ値を更新する」場面で+=と-=が大活躍していることが分かります。
合計・平均の計算で *=, /= を使う例
次に、合計と平均を求める処理で*=と/=を使ってみます。
ここでは、税率を掛ける例と、平均値を求める例を組み合わせてみましょう。
#include <stdio.h>
int main(void) {
int price1 = 120;
int price2 = 150;
int price3 = 200;
int sum = 0;
double avg;
double tax_rate = 1.10; // 10% の税込みを表す倍率
// それぞれ税込み金額にする (int から double への代入に注意)
double p1 = price1 * tax_rate;
double p2 = price2 * tax_rate;
double p3 = price3 * tax_rate;
// *= を使ってもよいが、ここでは分かりやすさを優先
// 例: price1 *= tax_rate; のようにすると price1 の型が int のままなので
// 小数点以下が失われてしまうことがあります。
// 合計金額を求める
sum += (int)p1; // 小数点以下を切り捨てて合計
sum += (int)p2;
sum += (int)p3;
// 平均値を求める (double で計算)
avg = sum; // int から double へ代入
avg /= 3.0; // avg = avg / 3.0; と同じ。実数で割るので小数も保持される
printf("合計金額(整数に切り捨て)は %d 円です\n", sum);
printf("平均金額は %.2f 円です\n", avg);
return 0;
}
合計金額(整数に切り捨て)は 517 円です
平均金額は 172.33 円です
この例では、/=を使って平均値を求めています。
平均を求めるときは整数で割ると小数点以下が失われるので、3.0のように実数で割ることが大切です。
*=については、整数に対して使うと小数点以下が切り捨てられるという性質があります。
そのため、税率のような小数の倍率を掛けるときには、最初からdouble型を使う方が安全です。
配列やループでコードをスッキリ書く練習
配列とループを組み合わせると、複合代入演算子の出番がさらに増えます。
ここでは、5人分の点数を配列に入れ、合計と平均を求める例を見てみましょう。
#include <stdio.h>
int main(void) {
int scores[5] = {80, 75, 90, 60, 85};
int i;
int sum = 0;
double avg;
// 配列の要素を順番に取り出して合計を求める
for (i = 0; i < 5; i++) {
// sum = sum + scores[i]; と同じ
sum += scores[i];
}
// 平均点を求める
avg = sum; // int から double へコピー
avg /= 5.0; // avg = avg / 5.0; と同じ
printf("合計点は %d 点です\n", sum);
printf("平均点は %.1f 点です\n", avg);
return 0;
}
合計点は 390 点です
平均点は 78.0 点です
このように、配列+ループ+複合代入の組み合わせは、C言語の基本パターンとして非常によく登場します。
複合代入演算子を使うことで、コードが次のようにスッキリと読みやすくなります。
sum = sum + scores[i];→sum += scores[i];avg = avg / 5.0;→avg /= 5.0;
まとめて練習できる小さなサンプルプログラム
最後に、これまで説明した+=、-=、*=、/=をまとめて使う小さな練習用プログラムを紹介します。
ユーザーから整数を複数入力して、その合計・平均・最大値と最小値との差などを計算してみましょう。
#include <stdio.h>
int main(void) {
int n; // データの個数
int i;
int value; // 入力された値
int sum = 0; // 合計
double avg; // 平均
int max; // 最大値
int min; // 最小値
int range; // 最大値と最小値の差
printf("いくつのデータを入力しますか: ");
scanf("%d", &n);
if (n <= 0) {
printf("1 以上の数を入力してください。\n");
return 0;
}
printf("%d 個の整数を入力してください。\n", n);
// 1個目の入力で初期値を決める
scanf("%d", &value);
sum += value; // sum = sum + value;
max = value;
min = value;
// 2個目以降の入力を処理
for (i = 2; i <= n; i++) {
scanf("%d", &value);
// 合計を更新
sum += value;
// 最大値・最小値を更新
if (value > max) {
max = value;
}
if (value < min) {
min = value;
}
}
// 平均の計算 (double にしてから /= を使う)
avg = sum; // int → double
avg /= n; // avg = avg / n;
// 範囲(range) = 最大値 - 最小値
range = max; // range に max をコピー
range -= min; // range = range - min;
printf("合計 = %d\n", sum);
printf("平均 = %.2f\n", avg);
printf("最大値 = %d\n", max);
printf("最小値 = %d\n", min);
printf("最大値と最小値の差 = %d\n", range);
return 0;
}
いくつのデータを入力しますか: 5
5 個の整数を入力してください。
10
20
15
8
12
合計 = 65
平均 = 13.00
最大値 = 20
最小値 = 8
最大値と最小値の差 = 12
このプログラムでは、次のように複合代入演算子を活用しています。
- 合計の更新に
sum += value; - 範囲の計算に
range -= min; - 平均の計算に
avg /= n;
実際にコンパイルして動かしてみると、複合代入演算子がどのように値を更新しているかがよく理解できると思います。
まとめ
複合代入演算子+=、-=、*=、/=は、C言語で「自分自身を使って値を更新する」場面に欠かせない基本機能です。
a = a + b;のような式を簡潔に書けるだけでなく、コードの意図もはっきりと伝えられます。
一方で、型による違いや整数の割り算、複雑な式との組み合わせには注意が必要です。
まずはループや配列処理の中で+=と-=から使い始め、慣れてきたら*=や/=も含めて自然に使いこなせるよう練習してみてください。
