2.

代入演算子 完全ガイド(= / += / -= / *= / /= / %= / **= / ビット演算複合 / 言語別の違い)

編集
この記事の要点
  • 代入演算子は変数に値を入れる演算子。基本は =
  • 複合代入演算子+= / -= / *= / /= / %= / **=)は演算と代入を 1 行にまとめる
  • a += 3a = a + 3 と等価。読みやすさと記述量を両立
  • ビット演算にも複合形がある(&= / |= / ^= / <<= / >>=
  • 言語によって細部は違うが、C 系言語と PHP・Python・JavaScript・Java はほぼ共通の記法

代入演算子とは

代入演算子(assignment operator)は変数に値を入れるための演算子です。基本の =(イコール)に加えて、四則演算やビット演算と組み合わせた複合代入演算子が用意されており、コードを簡潔に書けます。

基本: =

let a = 10;     // 変数 a に 10 を代入
let name = "tarou";

// 右から左へ代入される(右辺を先に評価)
let x = (a = 5) + 3;  // a に 5 を代入し、その値 5 + 3 = 8 が x に入る

多くの言語で =右辺を評価して左辺の変数に代入する演算子です。数学の「等しい」とは別物なので、比較したいときは == / === を使います。

複合代入演算子(算術)

演算子意味等価な式
+=加算して代入a = a + b
-=減算して代入a = a - b
*=乗算して代入a = a * b
/=除算して代入a = a / b
%=剰余を代入a = a % b
**=累乗して代入a = a ** b
let a = 10;
a += 5;   // a は 15
a -= 3;   // a は 12
a *= 2;   // a は 24
a /= 4;   // a は 6
a %= 4;   // a は 2
a **= 3;  // a は 8(2 の 3 乗)

複合代入演算子(ビット演算)

演算子意味
&=AND して代入
|=OR して代入
^=XOR して代入
<<=左シフトして代入
>>=右シフト(符号付き)して代入
>>>=右シフト(符号なし、JS のみ)して代入

文字列にも += が使える

let msg = "Hello";
msg += ", ";
msg += "world!";
// msg は "Hello, world!"

言語別の追加演算子

演算子言語意味
??=JS / PHP左辺が null / undefined のときだけ代入
||=JS / Ruby左辺が偽値のときだけ代入
&&=JS左辺が真のときだけ右辺で代入
.=PHP文字列を連結して代入
:=Python 3.8+ / Goセイウチ演算子(式の中で代入)
let user = null;
user ??= { name: "guest" };
// null だったので代入される

let count = 0;
count ||= 10;
// 偽値(0)だったので 10 に上書き

注意点

項目説明
=== の取り違いif (a = 1) は代入してしまい常に真。比較は == / ===
整数除算の落とし穴言語によって /= が整数除算になる場合あり(旧 Python 2 など)
不変な値への代入JS の const、Java の final 変数には複合代入もエラー
右結合性a = b = 0 は右から評価され、両方に 0 が入る

連鎖代入

多くの言語で複数変数に同じ値をまとめて入れられます。これは =右結合で、戻り値を持つことで成り立ちます。

let a, b, c;
a = b = c = 0;
// 右から評価:
// 1) c = 0  →  値 0
// 2) b = (c=0) の値 0  →  値 0
// 3) a = (b=...) の値 0
// 結果: a, b, c はすべて 0

ただし参照型を入れるときは要注意。次の例では全ての変数が同じオブジェクトを参照します。

let x, y, z;
x = y = z = {count: 0};
y.count = 5;
console.log(x.count);  // 5 (同じオブジェクトを共有)

分割代入(destructuring)

モダンな言語では配列やオブジェクトの要素を1 行で複数変数に代入できる構文があります。

// JavaScript / TypeScript
const [first, second, ...rest] = [1, 2, 3, 4, 5];
// first=1, second=2, rest=[3,4,5]

const {name, age = 20} = {name: "tarou"};
// name="tarou", age=20(既定値)

// 変数の入れ替え(一時変数なし)
let a = 1, b = 2;
[a, b] = [b, a];
# Python
first, *rest, last = [1, 2, 3, 4, 5]
# first=1, rest=[2,3,4], last=5

a, b = 1, 2
a, b = b, a   # 入れ替え

言語別の代入挙動の違い

言語= の挙動
JavaScript / TypeScript右辺の値を左辺に代入。オブジェクトは参照
Python変数は名前バインディング。リスト/辞書は参照
Java / C#プリミティブは値、参照型は参照
C / C++= は値コピー。& でアドレス取得
PHP配列は値コピー、オブジェクトは参照
Go= は代入、:= は宣言+代入(短縮)

代入式と代入文

C / Java / JavaScript / PHP では =として扱われ、戻り値(代入された値)を持ちます。そのため while ((line = readLine()) != null) { ... } のようにループ条件で使えます。一方 Python の =で戻り値を持たないため、ループ条件には Python 3.8+ で導入されたセイウチ演算子 := を使います。

# セイウチ演算子(Python 3.8+)
while (chunk := f.read(1024)):
    process(chunk)

関連

  • 演算子 — 親カテゴリ
  • 算術演算子 / 比較演算子 / 論理演算子 / ビット演算子
  • 三項演算子 / null 合体演算子 (??)
  • const / let / var — 変数宣言
編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. 算術演算子
  2. 代入演算子
  3. 比較演算子
  4. 論理演算子

最近更新/作成されたページ