2008-09-22 67 views
4

以什麼順序測試以下參數(使用C++)?C++二進制運算符優先順序

if (a || b && c) 
{ 
} 

我剛看到在我們的應用程序的代碼,我恨它,我想添加一些括號只是澄清排序。但我不想添加括號,直到我知道我將它們添加到正確的位置。

編輯:接受的答案&跟進

該鏈接有更多的信息,但它不是完全清楚這意味着什麼。看來||和& &是相同的優先級,在這種情況下,它們從左到右進行評估。

http://msdn.microsoft.com/en-us/library/126fe14k.aspx

回答

4

here

a || (b && c) 

這是默認的優先級。

+1

C++的優先級不可定製,因此「默認」是多餘的。 – 2008-09-22 09:42:55

+0

我的意思是「默認」,如「非括號內」 – tzot 2008-09-22 09:49:46

-2

我不確定,但應該很容易找到答案。

只需創建一個小程序與打印出的真值的語句: (真||假& &真)

如果結果爲真,那麼||具有比& &更高的優先級,如果它是falase,則是相反的。

7

[http://www.cppreference.com/wiki/operator_precedence](由谷歌搜索 「C++運算符優先級」 實測值)

即頁告訴我們,& &,在組13中,具有比||更高的優先級在組14中,表達式相當於|| (b & & c)。

不幸的是,維基百科文章[http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B#Operator_precedence]不同意這一點,但由於我的桌面上有C89標準,並且與第一個網站一致,因此我將修改維基百科文章。

0

回答後續問題:顯然,MSDN中的表已經過時了,也許有人無法做出正確的HTML表(或使用Microsoft工具生成它!)。
我想它應該看起來更像羅德里格引用的維基百科表,我們有明確的小節。
但很明顯,接受的答案是正確的,不知何故,我們與& &和||比如使用*和+。
你給的代碼片段對我來說是清晰明確的,但是我想添加括號也不會傷害任何一個。

2

& &(布爾AND)具有比||更高的優先級。 (布爾OR)。因此,以下是相同的:

a || b && c 
a || (b && c) 

一個很好的記憶規則是要記住,猶如乘,或像加法。如果我們帶*號和OR與+取代,我們得到了一個比較熟悉的等價:

a + b * c 
a + (b * c) 

其實,在布爾邏輯,AND和OR都類似於這些算術運算符:

 
a b a AND b a * b a OR b a + b 
--------------------------------------- 
0 0  0  0  0  0 
0 1  0  0  1  1 
1 0  0  0  1  1 
1 1  1  1  1  1 (2 really, but we pretend it's 1)