表示式將運算子作用於乙個或多個運算物件,每個表示式都有對應的求值結果。表示式本身也可以作為運算物件構成對多個運算子求值的復合表示式。
運算子
運算子操作物件數量
一元運算子
乙個二元運算子
兩個,不要求型別相同,能轉換成同型別即可
三元運算子
三個函式呼叫
不限過載運算子( overloaded operator and):對已存在的運算子重新定義適用於類型別的版本。需要注意的是,運算物件的個數、運算子的優先順序和結合律,都是無法改變的;而運算物件的型別和返回值的型別是可以改變的。
左值和右值
左值 指求值結果為物件或函式的表示式
1. 當乙個物件被用作右值的時候,用的是物件的值;當物件被用作左值的時候,用的是物件的身份(在記憶體中的位置)。
2. 在需要右值的地方可以用左值來代替,但是不能把右值當成左值使用。
右值 指求值結果為值而非值所在位置的表示式
decltype
作用於左值時,其結果將是乙個引用型別。
優先順序和結合律
高優先順序運算子的運算物件較低優先順序運算子的運算物件更為緊密地組合;
優先順序相同情況下,組合規律由結合律確定;
括號無數優先順序和結合律。
求值順序
對於沒有指定執行順序的運算子來說,如果表示式指向並修改了同乙個物件,將會引發錯誤並產生未定義的行為;下面的語句可以通過編譯並執行產生結果,然而這樣的**是錯誤的:
// 錯誤**示範:
int i =0;
std::cout << i <<
' '<<
++i << std::endl;
// g++ 4.8.4 編譯執行結果為 1 1
四種明確規定運算物件求值順序的運算子:
邏輯與(&&)
先求左側運算物件的值,該值為真時才對右側運算物件求值。
邏輯或(||)
先求左側運算物件的值,該值為假時才對右側運算物件求值
條件運算子(?:)
先對條件求值,若條件為真,對表示式 1 求值並返回;否則,對表示式 2 求值並返回。
逗號運算子(,)
首先對左側運算物件求值,然後將求值結果丟棄,真正的結果是右側表示式的值。
運算物件的求值順序與優先順序和結合率無關。
複雜表示式的處理建議:
拿不準的時候最好用括號來強制讓表示式的組合關係符合程式邏輯的要求。
如果改變了某個運算物件的值,在表示式的其他地方不要再使用這個運算物件。
乙個重要的例外:
*
++iter;
// 遞增運算子必須先求值,然後才輪到解引用運算
c Primer學習筆記 4 表示式
第四章 表示式 1.在實際情況下,子表示式的計算順序通常是初學者出錯的根源,因此在你記不住某些操作符的計算順序時,加括號明確指定計算順序。2.只要能夠得到表示式的值 true 或false 運算就會結束,給定以下形式 expr1 expr2 expr1 expr2 如果下列條件有乙個滿足 在邏輯與表...
C Primer 學習筆記(3) 表示式
c 提供了一元操作符和二元操作符,另外還有三元操作符 三目操作符cond?expr1 exprl2 算術運算子 一元正號 返回運算元本身,對運算元不做任何修改。邏輯運算子 存在短路求值。優先順序表如下 precedence operator description example associati...
C Primer 表示式雜記
1.delete用於釋放指標指向的陣列空間,如delete p.2.對於位操作符,由於系統不能確保如何處理其運算元的符號位,所以強烈建議使用unsigned整形運算元。3.只有在有必要時才使用後置操作符。因為前置操作符要做的工作更少,如 i 只需加1後返回加1的結果即可,而i 則需先儲存運算元原來的...