表達式基礎
- 每個表達式有結果,字面值/變量結果為自身
- 結果分左值(可寫入,如
++i)和右值(如 i++、字面值)
- 逗號運算符結果為最右子表達式的值,若最右為左值則整體為左值
求值順序與副作用
- 運算符優先級、結合性決定結構,但操作數求值順序未規定(如
f1()*f2() 調用順序不定)
- 序點:上一序點到下一序點間,對象值至多修改一次。長表達式中多次修改同一對象行為未定義
i++ 返回舊值(右值),++i 返回新值引用(左值)
關鍵運算符細節
| 運算符 | 注意點 |
| % / | 負數運算結果符號/絕對值在 C++98/03 中實現定義,C++11 規定截向零 |
| && \|\| | 短路求值:左操作數決定結果則不算右操作數 |
| == vs = | 易混淆,建議常量左放:if (42 == i) 防誤寫成賦值 |
| 位運算 | 操作數為有符號負數時移位行為實現定義,建議用無符號類型 |
| 移位 | 左移補 0,右移無符號補 0,有符號補符號位(算術移位)或 0(邏輯移位)視實現 |
流輸出優先級陷阱
cout << 42 + 10; // 正確,+ 優先級高於 <<
cout << (10 < 42); // 正確,括號提升優先級
cout << 10 < 42; // 錯誤:(cout<<10) 返回 ostream&,與 42 比較無意義
賦值表達式
- 右結合:
a = b = 0 等價 a = (b = 0)
- 返回左操作數引用,可鏈式賦值
- 優先級極低,幾乎最後結合
交換兩數技巧
// 算術法(可能溢出)
a = a + b; b = a - b; a = a - b;
// 異或法(無溢出,同變量時歸零需注意)
a ^= b; b ^= a; a ^= b;