2013-12-10 44 views
0

我使用这个说法C++运算符的优先级

if ((pm && pn) || (pm == false && pn == false)) 

它应该返回true,只有在两个下午和PN是真的还是如果两个都是假的。但是,如果只有第一个(下午)是真的,这也是真的。

所以现在总是这样:

0 0 = 1 
0 1 = 0 
1 0 = 1 
1 1 = 1 

,但我需要它这样的工作:

0 0 = 1 
0 1 = 0 
1 0 = 0 
1 1 = 1 

你能告诉我我在哪里犯错?

回答

4

你想要什么简单地说就是:

if (pm == pn) 
+2

只有当变量已经有'bool'类型,或者保证只有一个可能的非零值。 –

+0

非常感谢。这是最好的解决方案。不知道为什么我没有看到它 – horin

+1

我假设他们在哪里知道类型'bool',如果不是简单的代码:'if(!pm ==!pn)' –

2

您正在检查pm是否为真两次。您还需要检查两者是否相同,而不是它们是否都是真实的。所以,

if ((pm == pn) 
     ^^ ^^ 
2
pm && pm 

应该

pm && pn 
    ^

整个表达式可以简化为

pm == pn 

如果变量已经有bool类型。

1
if ((pm && pm) || (pm == false && pn == false)) 

它应该返回true,只有在两个下午和PN是真的还是如果两个都是假的。但是,如果只有第一个(下午)是真的,这也是真的。

因为你犯了一个错字。你的意思是pm && pn

取而代之的只是编写if (pm == pn),这相当于两个变量的唯一语义值的确是truefalse

另外,考虑让你的变量名称更清晰和更明确。

请注意,运算符优先级与此无关。

2

为什么不试试xor?

if (!(pm^pn)) { /*...*/ } 

还是简直相等?

if (pm == pn) { /*...*/ } 
0

由于问题的标题询问优先级,请注意||&&优先级低。因此,两套内部括号是多余的,和原来的表达只是一种说法

if (pm && pm || pm == false && pn == false) 

现在,固定明显的错字更长的路:

if (pm && pn || pm == false && pn == false) 

删除不需要的明确比较:

if (pm && pn || !pm && !pn) 

最后,一个不太明显的转型,这其他人所说:

if (pm == pn)