2014-05-12 24 views
1

的C代碼(其中ab是類型double兩者)​​下面的代碼片段是我的問題是什麼:檢查在C這樣的操作順序「如果」語句

if(1.0-a < b && b <= 1.0) 

基於所示的操作順序在Wikipedia我明白這是評估一樣用括號下面的代碼片段:

if(((1.0-a) < b) && (b <= 1.0)) 

這就是我想要的。我只是想重新檢查一下我的理解,即兩個代碼片段的確按照C中的操作順序確實相同。

注意:顯然,我可以使用第二個代碼片段並明確要求if()進行評估;我問,因爲我已經在代碼中使用了第一個片段了一段時間,並且我想確保代碼中的先前結果是可以的。

+1

您是否在詢問操作順序(即操作的執行順序)或*關聯*(即哪些操作數與哪個操作員關聯)?括號影響後者,而不是前者。 –

+0

我在問,這兩個代碼片段是否總是會產生相同的結果,無論是關聯或操作順序的問題,我都不確定。 – Joshua

回答

4

快速回答:是的,它是等價的。

這意味着這兩個代碼片段的結果是相同的;意思是一樣的,但是當你談論操作順序時要小心。它看起來像我這裏的問題是關於優先級和關聯性。後者告訴你什麼表達式意味着,而不是其操作數的評估順序。要了解評估順序,請閱讀有關順序點:Undefined behavior and sequence points

4

您詢問「操作順序」,但我不認爲這就是您真正想知道的。

短語「操作順序」是指執行操作的時間順序。在大多數情況下,在表達式中執行操作的順序是未指定的。運營商是少數例外之一;它保證左操作數在其右操作數之前被評估(並且根本不可能評估右操作數)。

您可以添加哪些影響操作數相關的與運營商的括號 - 是的,兩人的表情

1.0-a < b && b <= 1.0 

((1.0-a) < b) && (b <= 1.0) 

是等價的。

括號可用於覆蓋運算符優先級。它們通常不影響操作員評估的順序。

例:此:

x + y * z 

等效於此:

x + (y * z) 

因爲乘法比加法一個更高的優先級。但三個操作數xy,並且z可在任何6個可能的訂單評價:

x, y, z 
x, z, y 
y, x, z 
y, z, x 
z, x, y 
z, y, x 

的順序使得在這種情況下沒有區別(除非它們中的一些volatile),但它能夠決定的事情,如果他們是副作用的子表達。