2016-12-17 46 views
-1

我在一次測試中偶然發現了一個關於算術優先級的問題,我無法圍繞它的答案一竅不通。C算術優先

float x = 5 % 3 * + 2 - 4.5/5 * 2 + 2; 

我的「理解」,現在是乘法必須首先發生分裂和模數之前,但是當我嘗試使用這種方法,答案是6.55,而不是4.20。我試着玩弄表達方式(在這裏和那裏添加括號),事實證明,5%3先於其他所有事情發生。我只是不明白爲什麼,因爲根據我提供的優先表,情況不應該如此。有人可以幫我解決這個問題嗎?

+1

它會如何運作?你有'* +',而且之間沒有什麼可操作的。有人請幫我理解。 – user902384

+0

當您擁有相同優先級的運算符時,首先會先處理該優先級。 –

+1

@Shiv,那個+是下面2中的一元運算符。 – sh1

回答

2

請參考documentation here

乘法,除法和餘數運算符的優先級高於加法和減法的優先級。

當乘法,除法或餘經營者去了一個又一個,那麼他們左相關,這意味着他們將通過一個給定的順序來執行的。

在你的例子中,5 % 3將首先被執行,然後乘法(無論數量是多少),然後除法4.5/5,然後結果乘以2,並且只有在執行加減之後纔會執行。

1

你的C代碼:

x = 5 % 3 * + 2 - 4.5/5 * 2 + 2; 

首先,一元加號和一元負的優先級最高:

x = 5 % 3 * (+ 2) - 4.5/5 * 2 + 2; 

其次,乘法,除法和餘數具有相同的優先級,從左至右相關向右:

x = ((5 % 3) * (+ 2)) - ((4.5/5) * 2) + 2; 

最後,加法和減法具有相同的優先級,相關聯的f ROM左至右:

x = ((((5 % 3) * (+ 2)) - ((4.5/5) * 2)) + 2); 

現在我們計算表達式:

x = (((2 * (+ 2)) - ((4.5/5) * 2)) + 2); 
x = (((2 * 2) - ((4.5/5) * 2)) + 2); 
x = ((4 - ((4.5/5) * 2)) + 2); 
x = ((4 - (0.9 * 2)) + 2); 
x = ((4 - 1.8) + 2); 
x = (2.2 + 2); 
x = 4.2;