導入
Javaでコードを書いていると、x = y = z = 0; のような「多重代入」を目にすることがあります。一見シンプルに見えますが、演算子の優先順位や評価順序を正しく理解していないと、意図しないバグを生む原因になります。今回は、Javaにおける代入演算子の特性と、知っておくべき演算子の優先順位について解説します。
基礎知識
Javaにおいて、代入演算子(=, +=, -=など)は「右結合」という珍しい性質を持っています。通常の算術演算子(+やなど)は「左結合」であり、左から順に計算されますが、代入演算子は右側の式が評価された結果を左側の変数に格納するため、右から左へと処理が流れます。
また、演算子の優先順位は非常に重要です。例えば、代入演算子は算術演算子や比較演算子よりも優先順位が低く設定されています。そのため、計算結果を代入する際には括弧が必要になるケースが多いことを覚えておきましょう。
実装/解決策
多重代入を正しく理解するためのポイントは、「右から順に評価される」というルールです。x = y = z = 10; という式は、内部的には以下のように評価されます。
1. z = 10 が評価され、zに10が代入される(この式の結果として10が返る)
2. y = (z = 10 の結果) が評価され、yに10が代入される
3. x = (y = 10 の結果) が評価され、xに10が代入される
この仕組みにより、複数の変数に同じ値を一括で初期化することが可能です。
サンプルプログラム
以下のコードをコピーして動作を確認してみてください。代入の評価順序と、括弧による優先順位の制御を実証しています。
public class AssignmentTest {
public static void main(String[] args) {
int x, y, z;
// 多重代入の例:右から順に評価される
x = y = z = 100;
System.out.println("x: " + x + ", y: " + y + ", z: " + z);
// 演算子の優先順位に注意が必要な例
int a = 10;
int b = 5;
// 代入演算子(=)は加算(+)より優先順位が低いため、
// 括弧を使わないと意図しない結果になる可能性がある
int result = a += b; // aにbを足してから代入
System.out.println("aの値: " + a + " (resultの値: " + result + ")");
// instanceof pattern matching との組み合わせ例(Java 16+)
Object obj = "Hello Java";
if (obj instanceof String s && s.length() > 5) {
System.out.println("文字列の長さは5より大きいです: " + s);
}
}
}
応用・注意点
現場で最も注意すべきなのは、「代入演算子を条件式の中に含める」というテクニックです。例えば、while ((line = reader.readLine()) != null) のような書き方はJavaでは一般的ですが、これは読みやすさを損なう場合もあります。
また、instanceof pattern matching(Java 16以降)を利用する場合、演算子の優先順位が複雑になります。論理演算子(&&)よりも代入演算子の方が優先順位が低いため、複雑な条件式を書く際は、明示的に括弧を使って評価順序を制御するのがシニアエンジニアとしての「可読性を保つための鉄則」です。コードは「動くこと」だけでなく「他人が読んだ時に一瞬で意図が伝わること」が重要です。

コメント