1. 程式人生 > >C++菜鳥學習筆記系列(12)——算術運算子

C++菜鳥學習筆記系列(12)——算術運算子

C++菜鳥學習筆記系列(12)

本期主題:算術運算子 C++語言為我們提供了一套豐富的運算子,並定義了這些運算子用於內建型別的運算物件時所執行的操作。同時當運算物件時類型別時,C++語言也允許我們指定上述運算子的含義(運算子的過載)。

在介紹後面的算術運算子之前我們先來了解幾個概念。

(1)左值、右值 在C語言中左值和右值的差別並不大,我們可以簡單的理解成左值可以位於賦值語句的左側而右值則不能。但是在C++語言中,這兩個概念之間的區別就不止這麼簡單了。一個左值表示式的結果可以是一個物件或者是一個函式。我們可以做一個簡單的歸納:當一個物件被用作右值的時候用的是物件的內容/值;而當它被用作左值的時候用的是物件的身份/在記憶體中的位置。

(2)優先順序和結合律 複合表示式是指含有兩個或多個運算子的表示式。在求複合表示式的值時需要先將運算子和運算物件合理地組合在一起,而優先順序和結合律就決定了運算物件的組合方式。

注意:表示式中的括號()無視上述規則,我們可以使用括號將表示式的某個區域性括起來使其得到優先運算。

一般來說高優先順序運算子的運算物件要比低優先順序運算子的運算物件更容容易緊密地組合在一起。(例如我們最常見的算術運算子中乘除運算子的優先順序高於加減運算子,則在運算過程中乘法和除法的運算物件會先組合在一起,然後才能考慮加法和減法的運算物件)如果兩個運算子的優先順序相同,則這時候的組合規則就由結合律決定了,所有的算術運算子都符合左結合律,這意味著如果運算子的優先順序相同將按照從左向右的順序組合運算物件。 例如:

x = 18 - 7 - 3 * 2;

上一行程式碼中的x的值具體是多少呢?我們來簡單分析一下,表示式中含有乘法*和減法-運算子,我們根據優先順序確定乘法運算子的兩個運算物件為3和2,結果為6,則表示式可以變換成:

x = 18 - 7 - 6;

然後我們再來看變換後的表示式,兩個減法運算子的優先順序肯定是相同的,那麼問題來了,我們可以理解為:x =( 18 - 7 ) - 6; 也可以理解為x = 18 - (7 - 6 ) ;那麼在編譯器中具體是按照哪一種方式進行執行的呢?答案是第一種,我們在兩個運算子優先順序相同的情況下要考慮結合律,而所有的算術運算子又都滿足左結合律,即從左到右的順序組合運算物件。

(3)求值順序 優先順序和結合律為我們規定了運算物件的組合方式,但是不是運算物件的求值順序就是這樣規定好了呢?答案是否定的,大多數情況下,求值順序是和優先順序、結合律等沒有關係的,我們不會也不需要明確的指定求值的順序。 例如:

int i = f1() + f2();

在上行程式碼中,我們無法知道具體是先呼叫函式f1()還是先呼叫函式f2(),我們只需要知道這兩個函式都會在乘法*運算子執行之前被呼叫就可以了。

這裡有兩條對於複合表示式處理的小建議: (1)對於優先順序不能確定,或者自己不能夠分辨的時候最簡單有效的一個解決方法是使用括號來強制表示式的組合關係符合自己的期望。 (2)如果改變了某個運算物件的值,在這個表示式的其他地方不要再使用這個運算物件。

在討論了上述的一些基本概念後,我們來接著學習關於算術運算子的一些內容。

我們對於其優先順序可以簡單瞭解為:

 乘法(*) > 除法(/) > 取餘(%) > 加法(+) > 減法(-)

上述的運算子都比較簡單,我們只需要注意它們都滿足左結合律就可以了。除此之外我們還需要關注的是取餘運算子(%)中參與運算的運算物件必須是整數型別。而其他運算子在沒有特殊說明的情況下可以作用於任意算術型別(C++可以自動轉換成一種型別,或者我們在運算之前進行轉換)。

例如:

	int i = 3, j = 7, r;
	double k = 3.14;
	r = j % i;
	cout << "r = " << r << endl;
	r = j % k; // error
	cout << "r = " << r << endl;

好了這次我們就介紹到這裡了。

注:雖然這篇部落格的內容十分簡單,但是大家若有轉載還請標明出處!