
C言語のきほん|代入演算子の使い方
= は「等しい」じゃない!C言語の代入を“コピー”として理解すると、コードが一気に読みやすくなるよ。
C言語を書いていると、一番よく登場する記号のひとつが = です。
でもこれ、数学の「=(等しい)」だと思って読むと、いきなりつまずきポイントになります。
C言語の = は「右辺と左辺が等しい」ではなく、右辺の値を左辺にコピーして保存する操作です。
つまり、プログラムが動くときに「今の値がどう変化したか」を追うための、超重要なスイッチみたいな存在なんですね。
この記事では、
- 単純代入(=)の基本と、どんな順序で値が入るのか
- 左辺に置けるもの/置けないもの(無効な代入)
- 複数の変数にまとめて代入する書き方と注意点
- 複合代入(+= など)で式を短く・安全にするコツ
を、やさしく丁寧に整理していきます。
代入がスッと腹落ちすると、if や for の理解も、関数の引数の理解も、ぜんぶ楽になりますよ。
代入演算子は2種類ある
代入演算子には大きく2つあります。
| 種類 | 例 | 役割 |
|---|---|---|
| 単純代入演算子 | = | 右辺の値を左辺へコピーして保存する |
| 複合代入演算子 | +=, -=, *=, /=, %= など | 計算して、その結果をそのまま代入して更新する |
普段「代入演算子」と言うときは、まず = のことを指すことが多いです。
単純代入(=)は「コピー」だよ
単純代入演算子 = は、右辺の値を左辺の変数に入れます。
ポイントは 右辺は値(または式)で、左辺は入れ物(変数) だということです。
イメージはこんな感じです。
右辺で値を作る(計算する) → 左辺に保存する(コピーする)
代入の具体例(意味を言葉で追う)
たとえば次のような代入があったとします(文書の例と同じ構造のまま、少し別の内容で説明します)。
| 例 | 何が起きている? |
|---|---|
| x = 7; | 変数 x に 7 を保存する |
| x = y; | y の値を取り出して x にコピーする |
| x = z + 2; | z + 2 を計算して、その結果を x に保存する |
| x = x + 1; | x の値を取り出して 1 足して、結果を x に上書きする |
ここで大事なのは、x = x + 1; は「x と x+1 が等しい」という意味ではなく、x を更新する処理だということです。
シンプルなプログラム例(代入で値が変化する様子)
ファイル名:6_4_1.c
#include <stdio.h>
int main(void)
{
int points = 0; /* 現在のポイント */
int bonus = 50; /* ボーナスポイント */
points = 100; /* 定数を代入:ポイントを100にする */
printf("開始ポイントは%dです。\n", points);
points = bonus; /* 変数を代入:bonusの値をpointsへコピー */
printf("ボーナスを反映して%dになりました。\n", points);
points = points + 30; /* 式を代入:現在値に30を足して上書き */
printf("さらに加算して%dになりました。\n", points);
return 0;
}ここで読み取ってほしいこと
- 右辺を評価(必要なら計算)して「値」を作る
- 左辺は「保存先(変数)」
- points = points + 30; は points を更新する定番パターン
無効な代入(左辺に置けないもの)
代入は「保存」なので、左辺には 保存できる場所が必要です。
定数や計算結果には保存場所がないので、エラーになります。
| 書き方 | どうしてダメ? |
|---|---|
| 1 = a; | 1 は定数で、書き換えられない |
| a + b = 3; | a + b は計算結果で、保存先ではない |
よく言うと、左辺は「入れ物」じゃないとダメ、ということですね。
複数の変数への代入(右から左に進む)
C言語では、こんな書き方ができます。
a = b = c = 10;
これは右から左へ実行されます。
順序を分解するとこうです。
- c = 10 を実行して、c が 10 になる(式全体の値も 10)
- b = c を実行して、b が 10 になる(式全体の値も 10)
- a = b を実行して、a が 10 になる
なので、a, b, c が全部 10 になります。
ただし注意:読みやすさが落ちることがある
短く書けて便利なんですが、長い式でやると読みづらくなります。
たとえば初学者のうちは、こう書いても全然OKです。
c = 10;
b = c;
a = b;
「何をしているか」が一目で分かるのが一番強いです。
複合代入演算子で更新を短くする(+= など)
複合代入演算子は、計算して、その結果を同じ変数に代入するための書き方です。
代表例が += です。
| 元の書き方 | 複合代入 |
|---|---|
| x = x + 5; | x += 5; |
| x = x - 2; | x -= 2; |
| x = x * 3; | x *= 3; |
| x = x / 4; | x /= 4; |
| x = x % 10; | x %= 10; |
どっちを使うといい?
- 意味が明確なときは複合代入が読みやすいです(加算更新、減算更新など)
- 複雑な式になるなら、無理に短くせず分けたほうが安全なこともあります
複合代入のシンプル例(在庫の増減)
ファイル名:6_4_2.c
#include <stdio.h>
int main(void)
{
int stock = 12; /* 在庫数 */
printf("現在の在庫は%d個です。\n", stock);
stock += 5; /* 入荷 */
printf("入荷後の在庫は%d個です。\n", stock);
stock -= 3; /* 出荷 */
printf("出荷後の在庫は%d個です。\n", stock);
return 0;
}「増やす」「減らす」がそのまま記号になっていて、読みやすいですよね。
ちょっとした落とし穴(代入は式としても値を持つ)
C言語では、代入自体が「式」なので、値を持ちます。
たとえば (x = 3) は「3」という値になります。
この性質で、次のような書き方もできます。
a = (b = 10);
でも、こういう書き方は慣れていないと混乱しやすいので、教材としては必要になるまで控えめでOKです。
ここまでの理解チェック(ミニ表)
| 文 | 起きること |
|---|---|
| x = 3; | x に 3 を保存 |
| x = y; | y の値を x にコピー |
| x = y + 2; | y + 2 を計算して x に保存 |
| x = x + 1; | x を 1 増やして更新 |
| a = b = c = 10; | 右から左へ代入して全部 10 |
