2015-12-21 46 views
-3

我盯着下面的表達式,別人寫的:這個if語句的運算符優先級是什麼?

if (variableA == CaseA && GetCase(variableB) == CaseA && GetCase(variableC) == CaseA && !CaseB(variableB) || variableA != CaseA) 
{ 
    // do stuff 
} 

什麼是真的絆倒了我是該位:

!CaseB(variableB) || variableA != CaseA

,因爲沒有任何括號組條件一起。

C++編譯器如何評估這些if語句?如果AND運算符中的一個計算結果爲false,這是否意味着由於短路而不會檢查OR?

編輯

哇,我猜仇敵真的想今天去恨,考慮downvotes的量,除了-4每個答案(和計數?)的問題。而且,呃,爲什麼沒有真正的解釋?大聲笑。

保持優雅,人。保持優雅。 ;)

爲了記錄,簡單地說,有一個「從左到右的評估」在提供問題的有效答案方面並沒有真正說得太多。在發佈之前,我確實使用了Google的強大力量(這也導致我在這裏閱讀了幾篇文章)。

我承認我的錯誤在這裏沒有提到,雖然我認爲C++參考是最自然的鏈接來發布作爲答案的補充,但我得到的最好的信息是無意中從here,通過在源代碼示例以下報價:

|| has lower precedence than &&

這可以說是模糊的,因爲「低優先級」不是什麼,在這種情況下意味着方面還算規定。

無論哪種方式,對於那些真正爲你貢獻的人,你會收到一個贊成票 - 我會接受這個答案,它給了我真正想要的東西。

+0

否定的優先方面,它就像'A * B * C * d + e'。 –

回答

0

表達開始得到同樣的效果等同於:

((variableA == CaseA) && 
    (GetCase(variableB) == CaseA) && 
    (GetCase(variableC) == CaseA) && 
    (!CaseB(variableB)) 
) 
|| 
(variableA != CaseA) 

表達會從上往下進行評估(因爲短路規則) ,並且如果前四行中的任何行返回false,則將評估剩餘的前四行中的任何行。如果(且僅當)前四行中的一行返回錯誤,則將評估最後一行。

但我感興趣的是,最後一行是第一

+0

正確的想法,但你錯過了')**和**你的解釋顛倒了「最後一行」部分。如果前四個都是真的,那麼「最後一行」被跳過(而不是評估)。 – JSF

+0

@JSF - 謝謝!固定。 –

0

運營商&&比運營商||更高的優先級爲seen here,所以如果我加括號

if ((variableA == CaseA && GetCase(variableB) == CaseA && GetCase(variableC) == CaseA && !CaseB(variableB)) || variableA != CaseA) 

所以基本上

if (all_the_ands || variableA != CaseA) 
所有 &&將首先發生,那麼最後的 ||,換句話說

如果該表達式的左邊是true,則由於短路,右側不會執行。

+4

請不要傳播「會先發生」的神話。它引導人們(在一個案例中,這是一個發佈C++書籍的教授!!)將錯誤的優先順序排除在評估順序之外。 –

0

在您的示例中,運算符優先級如下。

! > ==> & &>

因此,首先評估的聲明將是

1)!CaseB(variableB的)只有當所有其他 「& &」 的條件恰好是。如果任何的 「variableA的== CaseA & & GetCase(variableB的)== CaseA & & GetCase(variableC)== CaseA」 真爲假則短circuting將在這裏發生,並且「!CaseB(variableB)」將不會被執行。

之後,

2)如果條件1)爲真,再次短路(如你猜對了),否則 「||」條件將被評估。

如果條件2)恰好爲真,則其他或(||)條件甚至不會因短路而被檢查。

+0

由於短路,您的答案中第(1)項不正確。 – JSF

+0

不,它不會。如果變量A!= CaseA沒有別的東西會被執行 –

+0

@MartinBonner,JSF:我爲你們製作了一個小程序.int fun() { std :: cout <<「\ n fun called \ n」; return 1; } int main() { if(fun()|| 1); } 輸出:有趣的叫 –

0

http://en.cppreference.com/w/cpp/language/operator_precedence

的優先級是爲在薩欽戈亞爾答案所列的(和如在上述鏈路更清楚地列出)。

似乎令您感到困惑的具體優先級細節是!直接關聯到CaseB(variableB)而不是更大。

該序列從左到右穿過每個短路&&||

如果您詢問的!CaseB(variableB) || variableA != CaseA左側的表達式爲false,則跳過!CaseB(variableB),並且其評估variableA != CaseA。但是如果前面的表達式是真的,它使用!CaseB(variableB)的值來決定是否評估其餘的。

初始測試variableA == CaseA與最終測試variableA != CaseA的組合看起來很混亂。這可能意味着什麼意圖,但可以更簡單地完成。

當您編碼(X && Y && Z)的含義是((X && Y) && Z),但由於&&的行爲方式,這與(X && (Y && Z))相同。所以variableA == CaseA&&的其餘操作數上扮演着守護的角色,所以如果是false,則跳到||的另一端,並進行相反的測試,最終解析爲true。所以,這本來是簡單的通過只是variableA != CaseA ||