表達式
1,應該把函數調用當作是一種運算符,這種運算符對參與運算的對象沒有數量限制。
2,關於“左值(lvalue)”和“右值(rvalue)”可以做一個簡單的歸納:當一個對象被用作右值的時候,用的是對象的值(內容);當對象被用作左值的時候,用的是對象的身份(在內存中的位置)。
更具體的左值與右值的舉例:C++ priemr 5ed P121
3,運算符的優先級規定了運算對象的組合方式,但是沒有說明運算對象按照什麼順序求值,在大多數的情況下,不會明確求值的順序,比如對於下面的表達式:
int i= f1() + f2();
先調用f1還是先調用f2是未知的。因此,對於這種運算符來說避免多個運算對象共同修改同一個變量,如下面的代碼中,最終輸出是未能確定的:
int i=0;
cout<< i << "" << ++i << endl; // 未定義
但C++中有4種運算符是明確規定了運算對象的求值順序的:邏輯與“&&”、邏輯或"||"、條件(?:)運算符、逗號運算符","。這也是為什麼在我們自己定義的類類型中,一般不會去重載這幾種操作符。
4,短路求值:邏輯與運算符和邏輯或運算符都是先求左側運算對象的值再求右側運算對象的值,當且僅當左側運算對象無法確定表達式的結果時才會計算右側運算對象的值。
5,區別i++與++i
後置操作符需要先保存原來的值,再將i+1,然後返回原來的值的副本;而前置操作符,只需要在原來值上加1,然後返回。所以++i比i++效率更高,當然如果i為int類型或指針時,編譯器會對i++進行優化,但如果是其他類類型或復雜類的迭代器時就不會了。
6,注意解除引用操作符與++操作符的優先級,在實際代碼中為了簡潔經常將*(i++)寫為*i++。因為++的優先級高於解除引用操作符。