c++ 定義了多種運算子,其中包括一元運算子,二元運算子,三元運算子。作用於乙個運算物件的運算子即是一元運算子,作用於兩個運算物件的運算子即是二元運算子。要特別注意,函式呼叫也是一種特殊的運算子,它對運算物件的數量沒有限制。
要理解運算子,首先要理解運算子的優先順序、結合律以及運算物件的求值順序。
過載運算子時,必須要有乙個運算物件是自定義型別,而且過載運算子不會改變運算子的運算物件個數,運算子的優先順序和結合律。
左值和右值是乙個很難理解的概念。最初在c語言中,左值表示可以位於賦值語句左側的值,但右值則不能。在c++中,兩者的區別則沒有那麼簡單。可以做乙個簡單的歸納:當乙個物件被用作右值時,用的是物件的值(內容),當物件被用作左值的時候,用的是物件的身份(在記憶體中的位置)。當乙個表示式,可以對其取址時,它則可以作為乙個左值。
不同運算子對運算物件的要求各不相同,有的需要左值運算物件,有的需要右值運算物件。返回值也不相同,有的返回左值結果,有的返回右值結果。乙個重要的原則是:在需要右值的地方,可以使用左值來代替,但是不能把右值當做左值來使用。當乙個左值被當做右值使用時,實際使用的是它的內容。
略優先順序規定了運算物件的組合方式,但是沒有說明運算物件按照什麼順序求值,比如:
a =(expr1) + (expr2);
我們無法判斷是expr1表示式先求值還是expr2表示式先求值。所以這有時可能造成歧義,比如
int i= 0;
a = i + (++i); //若先計算左邊,a結果為1,若先計算右邊表示式,a結果為2
c++中有四種運算子明確規定了運算物件的求值順序 && 、|| 、(,)、(?:)。
由於過載操作符會使上述四種操作符失去運算物件的求值順序,所以通常不應該對上述四種操作符進行過載操作。
C primer 讀書筆記
第2 章 變數和基本型別 1 變數直接初始化和變數 複製初始化 int ival 1024 direct initialization int ival 1024 copy initialization 初始化不是賦值 2 內建型別復 制初始化和直接初始化幾乎沒有區別 但 對類型別物件來 說,有些初...
C Primer讀書筆記
前些日子開始看 c primer 順便做一些筆記,既有書上的,也有自己理解的。因為剛學c 不久,筆下難免有謬誤之處,行文更是凌亂 所幸不是用來顯配的東西,發在linuxsir只是為了方便自己閱讀記憶,以防只顧上網忘了正事。書看了不到一半,所以大約才寫了一半,慢慢補充。const要注意的問題 1 下面...
C Primer讀書筆記
前些日子開始看 c primer 順便做一些筆記,既有書上的,也有自己理解的。因為剛學c 不久,筆下難免有謬誤之處,行文更是凌亂 所幸不是用來顯配的東西,發在linuxsir只是為了方便自己閱讀記憶,以防只顧上網忘了正事。書看了不到一半,所以大約才寫了一半,慢慢補充。const要注意的問題 1 下面...