for(int i=2,j=1; j<10; i=(i==9)?(((++j)/j)+1):(i+1)) {
System.out.printf("%d*%d=%2d%c", i, j, i*j, (i==9?'\n':' '));
}
| 表達式 | 值 | 副作用 | j 變化 |
|---|---|---|---|
| `++j` (前綴自增) | **遞增後的值** (如 j=1 → 表達式值 2) | **修改變量 j 本身** (j 變為 2) | ✅ 永久改變 |
| `j+1` (加法表達式) | **j+1 的結果** (如 j=1 → 表達式值 2) | **不修改 j** (j 仍為 1) | ❌ 不改變 |
// 初始: i=2, j=1
// 條件: j<10 (1<10 true)
// 體: 輸出 2*1=2
// 迭代: i==9? false → i = i+1 = 3
// 下輪: i=3, j=1 ... 直到 i=9
// 當 i=9 時:
// 條件: j<10 (仍為 1<10 true)
// 體: 輸出 9*1=9
// 迭代: i==9? true → ((++j)/j)+1
// ++j: j 從 1 變為 2, 表達式值 2
// /j: 2 / 2 = 1
// +1: 1 + 1 = 2
// 新 i = 2, j = 2 (關鍵:j 已永久變為 2!)
// 下輪: i=2, j=2 → 輸出 2*2=4 ... 直到 i=9
// 迭代: ++j → j=3, (3/3)+1=2, i=2
// 如此 j 遞增 1→2→3...9,循環結束
i = (i==9)? (((j+1)/j)+1) : (i+1);
// j 永遠是 1
// (1+1)/1 + 1 = 2/1 + 1 = 3
// i 變為 3, j 仍為 1
// 陷入死循環:i 在 2~9 循環,j 永不增長,條件 j<10 永真
`++j` 修改變量本身,推動循環狀態前進;`j+1` 僅計算臨時值,不改變狀態。 此循環巧妙利用 `++j` 的副作用實現外層 `i` 重置與內層 `j` 遞增的雙重控制,生成九九乘法表。調試時在循環體首行打印 `i,j` 可直觀觀察變化。