好的很明显这个问题对于经验丰富的人来说可能听起来很愚蠢,但是,对于以下几行,我得到的结果是 0 :
int x = 2,
y = -2;
cout << (x++ - y && (--x + y));
我理解这意味着这两个表达式中的任何一个等于0,但是如何?据我了解,这应该是(3&amp;&amp; -1)?
另外,有点小问题:x ++什么时候生效?在同一个表达式中的下一个x出现,在同一行中的左移运算符之后,还是在下一个语句中?
谢谢!
答案 0 :(得分:4)
据我了解,这应该是(3&amp;&amp; -1)?
你理解错误:
第一个左侧是完全评估的,因为逻辑and
进行短路评估是必要的(可以找到详细信息here)
x++ - y == 4 // as result of x++ == 2 so (2-(-2)), after that x == 3
结果为true
,因此评估右侧:
--x + y == 0 // as result of --x == 2 so (2+(-2)), after that x == 2
右侧的结果为false
,因此and
的结果为false
,std::ostream
打印为0
注意:逻辑or
和and
操作的短路评估使这些代码有效(使它们排序)但你最好避免这种可疑的表达式。例如,简单地将逻辑and
替换为二进制将使其成为UB。