2016-08-18 149 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