每乙個表示式都有乙個結果,字面值常量也是表示式,其結果就是值本身。除了特殊用法外表示式的結果是右值。是左值的情況也有,比如++i;這個表示式就是乙個左值;還有逗號運算子的結果是表示式最右側操作符德值,如果最右是乙個左值的話,那整個逗號表示式就是左值。
表示式涉及到操作符和運算元,操作符有優先順序規則,有結合性,還有運算元的求值順序。就算子的求值順序而言,比如f1() * f2();兩個函式的返回值進行相乘,但無法確定先呼叫哪個函式。
操作符%成為「求餘」或是「取模」,運算元為整型,其中bool型別也可以。
對於「%」和「/」這兩個操作符來說。如果只有乙個運算元為負數,那這兩種操作的結果(這裡僅指絕對值,不考慮符號)都是取決於機器的;取模運算的符號也是取決機器的;但除法操作的結果肯定是負數。舉個例子:
21/ -5:依賴機器的,結果是-4或是-5
21% -5:依賴機器的,對應的結果是1或是-4
在邏輯表示式中,邏輯與和邏輯或總是先計算左運算元,再計算右運算元。只有在僅靠左運算元無法判斷表示式結果時,才會求解器右運算元。我們稱這種運算原則為「短路求值」。
相等測試與bool字面值。由於bool中的true可以轉換為1,所以如何判斷某值與true相等卻成了難題。這裡要考慮某值val的型別,如果val是bool型別的,那麼正確的判斷就是if ( val ) ;即可。如果val不是bool型別,那判斷就和if ( val ==1 ) ;等價了;假如val是整型,那if ( val )則是當且僅當val為0時為邏輯假,其餘的值,無論正負都是邏輯真。
位操作符的運算元是整型,這裡的整型不僅可以是正整數,也可以是負整數。但對於負整數的符號位處理方式,不同的機器有著不同的實現,所以盡量使用無符號正整數來作為位運算的運算元。
位運算中的左移和右移操作原則。無符號來說,左移是數值擴大,右側補0;右移是數值減小,左側補0。對於有符號來說,其右移過程中,左側可能是補0將其變成正數,也可能補1不改變其符號,這都依賴於機器。
cout<<42 + 10;正確,因為+高於<<
cout<<(10 < 42);也正確,因為有括號
cout<<10 < 42;錯誤,因為《高於關係運算子。cout<<10之後返回乙個ostream的引用,返回引用的目的是可以連續輸出,達到流的效果。將乙個ostream引用和42對比較是無意義的。
賦值操作的右結合性。
intival, jval; ival = jval = 0;這是合法的。賦值運算子也有返回值,先執行jval= 0,返回乙個整型再賦給ival。賦值運算子具有很低的優先順序。
判等和賦值容易出錯的地方。if ( i = 42 )這句話實際上是對的,字面解釋是把42賦給i,然後判斷i的真或假。但這顯然是無意義的,這句**像是被寫錯的,原意是if ( i== 42 )。為了能避免這樣的隱蔽錯誤,可以寫成if ( 42 == i)這樣一來,假如少寫了個「=」if( 42 = i )就是編譯錯誤,可以及時發現。
關於如何交換兩個數的值.
算術方法:a = a + b; b = a – b; a = a – b;
位運算方法: a ^= b; b ^= a; a ^= b;
對於i++和++i的更深層次討論,在乙個長的表示式中有多個關於i的自增和自減操作,這樣的表示式的結果是依賴機器的。這裡面有乙個概念是任何語言的表示式求值都逃不掉的,那就是序點。序點直觀來說就是當執行到此序點時必須保證序點前的子表示式已經求出結果。在c++中規定,上乙個和下乙個序點之間,物件的值至多被修改1次。至於規定表示式中的哪些地方設定序點,這有機器實現決定。值得一說的是在長表示式中不要試圖多次對乙個物件修改。
i++是右值,++i是左值。
i++的具體實現:
constint int::operator++(int)
++i的實現細節:
int&int::operator++()
c primer 學習筆記 4
左值 右值,乙個物件被用作左值時,用的是位址,用作右值,用的是內容,左值可以當做右值使用,使用的是內容 賦值 取位址 解引用 下標 迭代器解引用,遞增遞減用的都是左值 一元前置,賦值 3元運算子,賦值,右結合 運算子的運算物件是小整形,就會自動提公升。char a 1 a a轉為int,後取反 隱式...
c primer學習筆記 4 運算子
一元 算術 乘法 算術 加法 注意點 溢位問題,操作型別.關係和型別檢測 邏輯非,邏輯與,邏輯或 4.1賦值操作的右結合性 a b 0 4.2復合賦值操作符 4.3自增和自減操作符 分為前置和後置兩種形式 i和i 前置只需要返回結果,後置則需要儲存原值,以便返回未操作之前的結果.這個是需要注意的操作...
c Primer學習筆記 4 表示式
第四章 表示式 1.在實際情況下,子表示式的計算順序通常是初學者出錯的根源,因此在你記不住某些操作符的計算順序時,加括號明確指定計算順序。2.只要能夠得到表示式的值 true 或false 運算就會結束,給定以下形式 expr1 expr2 expr1 expr2 如果下列條件有乙個滿足 在邏輯與表...