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;

これは右から左へ実行されます。
順序を分解するとこうです。

  1. c = 10 を実行して、c が 10 になる(式全体の値も 10)
  2. b = c を実行して、b が 10 になる(式全体の値も 10)
  3. 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