2016-08-18 193 views
0
int a = 0, b = 0, c = -1; 

if (b = a || b == ++c) 
    a+=3; 

爲什麼a,b和c分別爲3,1,0?更具體地說,爲什麼是b 1而不是0?if語句中的賦值運算符

+1

你爲什麼期望它是0? – user2357112

+4

用parens來闡明操作順序: 'if(b =(a ||(b == ++ c)))' – qxz

+0

@ sri.vatsa:「爲什麼是b 1而不是0」...爲什麼不? – AnT

回答

0

一旦你與運營商的優先級清楚,這將是您輕鬆通過this應對這種類型的questions.Go的瞭解運算符優先級在C

你應該在通過優先級列表後看到我的答案,因爲那樣它會在你的腦海中更容易得到。現在

,來到你的問題....

開始在上面的代碼中使用的所有運營商,++cc最高precedence.So值變爲0,然後價值c相比的b這裏b == ++c值計算結果爲true1現在的1a||被認爲是1

最後。所以if報表的總體執行結果爲true和a值由3遞增這個結果1被分配到b。因此最後的值爲a=3,b=1 and c=0

6

因爲||的優先級高於=,所以它的分析就像你寫的一樣。

if (b = (a || (b == ++c))) 

這計算出a || (b == ++c)。這是因爲b == 0++c == 0,所以b == ++c爲真,並且真實爲1

添加括號來得到你想要的東西:

if ((b = a) || (b == ++c)) 

但恕我直言,一般最好避免寫這樣複雜的表達式。做他們單獨的語句:

b = a; 
if (b || b == ++c) 
+0

我想知道這個意圖是否首先要編寫'if(b == a || b == ++ c)'。 –

+0

「添加括號以得到你想要的結果:」你是如何得出這是OP想要的結論的?如果我們開始跳到結論,我們可能想要跳到的第一個結論是OP實際上想要'b == a',而不是'b = a'。 – AnT

+0

因爲他說他預計'b'是'0',而不是'1'。 – Barmar