x=5修改x,x=y++修改x,y,x=x++修改x兩次);, 左操作數求值後|| 左操作數求值後&& 左操作數求值後? : 第一操作數求值後int i, j;中逗號和分號)for循環控制條件中兩個分號x = x++;int i=0; m = (++i)+(++i)+(++i)+(++i);m=11, i=4m=16, i=4
x[i] = i++; // 讀i寫i順序未定
printf("%d %d", i++, i++); // 參數求值順序未定
func(x, x++); // 實參求值順序未定
// 錯誤
x[i] = i++;
// 正確
x[i] = i;
i++;
// 錯誤
printf("%d %d", i++, i++);
// 正確
int t1 = i, t2 = i+1;
printf("%d %d", t1, t2);
i += 2;
// 錯誤
func(x, x++);
// 正確
func(x, x);
x++;
=、+=等賦值運算符,右操作數先於左操作數求值(但x = x++仍未定義,因++副作用順序未規定)-Wsequence-point 警告可疑序列點問題/Wall 部分檢測序列點是C/C++語義模型的基石。理解副作用與序列點關係,能從根源規避一類極難復現、極具破壞力的未定義行為。鐵律:一語句一副作用,讀寫分離,拒絕聰明單行代碼。