Java 中的後置遞增 a++ 與乘法運算結合時,常讓初學者困惑。例如:
int a = 2;
int b = a + 3 * a++; // 結果 b = 8
int a = 2;
int b = (a++) + 3 * a; // 結果 b = 11
為什麼同樣包含 a++ 和 *3,結果卻大相逕庭?關鍵在於 Java 的運算式求值規則:從左至右掃描、依優先級構建運算指令堆疊。
a → 取值 2 入堆疊+,需兩個運算元,繼續掃描3 → 入堆疊* 優先級高於 +,掃描下一個運算元 a → 取值 2 入堆疊++ 優先級最高,執行 a++:a 變為 3,但堆疊中仍保留原值 22, 3, 2, ++, *, +2 * 3 = 6,再 2 + 6 = 8(a++) + 3 * a 中,括號強制先計算 a++,此時 a 變為 3,隨後 3 * a 使用新值 3,得到 9,最後 2 + 9 = 11。
a++ 的副作用(修改變數)在該運算元求值完成後才生效,不影響同一運算式中已取得的舊值。建議:避免在單一運算式中混用副作用運算子,拆分為多行程式碼以提升可讀性與可維護性。