我使用这个说法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
你能告诉我我在哪里犯错?
我使用这个说法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
你能告诉我我在哪里犯错?
你想要什么简单地说就是:
if (pm == pn)
您正在检查pm
是否为真两次。您还需要检查两者是否相同,而不是它们是否都是真实的。所以,
if ((pm == pn)
^^ ^^
pm && pm
应该
pm && pn
^
整个表达式可以简化为
pm == pn
如果变量已经有bool
类型。
if ((pm && pm) || (pm == false && pn == false))
它应该返回true,只有在两个下午和PN是真的还是如果两个都是假的。但是,如果只有第一个(下午)是真的,这也是真的。
因为你犯了一个错字。你的意思是pm && pn
。
取而代之的只是编写if (pm == pn)
,这相当于两个变量的唯一语义值的确是true
和false
。
另外,考虑让你的变量名称更清晰和更明确。
请注意,运算符优先级与此无关。
为什么不试试xor?
if (!(pm^pn)) { /*...*/ }
还是简直相等?
if (pm == pn) { /*...*/ }
由于问题的标题询问优先级,请注意||
比&&
优先级低。因此,两套内部括号是多余的,和原来的表达只是一种说法
if (pm && pm || pm == false && pn == false)
现在,固定明显的错字更长的路:
if (pm && pn || pm == false && pn == false)
删除不需要的明确比较:
if (pm && pn || !pm && !pn)
最后,一个不太明显的转型,这其他人所说:
if (pm == pn)
只有当变量已经有'bool'类型,或者保证只有一个可能的非零值。 –
非常感谢。这是最好的解决方案。不知道为什么我没有看到它 – horin
我假设他们在哪里知道类型'bool',如果不是简单的代码:'if(!pm ==!pn)' –