表達式中對同一變量多次修改、或修改後又讀取,行為未定義 (UB)。不同編譯器 (VC6/TC/VS/GCC) 結果不同,甚至同一編譯器不同優化等級結果不同。
int i = 1;
i = i++ + ++i * i--; // 未定義行為
printf("%d", i); // 可能輸出任意值,甚至格式化硬盤(理論上)
| 表達式 | 結果 | 解析 |
|---|---|---|
| `int i=1; i = i++;` | **UB** | 修改與讀取無序列點 |
| `int i=1; int j = i++ + i++;` | **UB** | 兩次修改 i |
| `int i=1; int j = ++i + ++i;` | **UB** | 兩次修改 i |
| `int i=1; int j = i++ + 1;` | j=2, i=2 | 單次修改,安全 |
| `int a=1; int b = a++ + ++a;` | **UB** | 修改 a 兩次 |