本帖最后由 liulinjie 于 2014-5-11 23:26 编辑
&& 比 || 优先级高, 所以第三行等价于 (++x) || (++y && ++z)
|| 运算先判断左边式子, 如果左边为真, 那么整个或运算的表达式就为真, 就不会再判断右边的值; 只有在左边的值判断为0的时候, 才会去判断右边式子的值.
左边的 ++x 是前置加加, x的值为1, 返回值为1. 因为左边的值为真, 或运算就判断为真, 右边的部分就不再进行判断了, 所以 ++y && ++z 是不执行的.
所以运行结果为, x = 1, y = 0, z = 0
[扩展一下]
如果左边的式子是 x++ 后置加加, 那么 x++的返回值为0, 左边的式子判断为假, 就会继续判断右边的式子.
右边是 && 运算. 如果&&左边的表达式值为假, 那么整个&&表达式的值为假, 就不需要再判断&&右边的式子. 如果&&左边的式子为真, 就需要继续判断&&右边的式子.
所以计算 ++y && ++z 时, 因为++y返回值为1(真), 就还需要运算右边的++z.
如果是 y++ && ++z的话, 因为y++返回值为0(假), &&表达式就可以返回假, 就不需要再运算右边的++z.
[小结一下]
++x || ++y && ++z -> 运算完x++就返回值了 -> x = 1, y = 0, z = 0
x++ || ++y && ++z -> 运算x++ y++ z++ -> x = 1, y = 1, z = 1
x++ || y++ && ++z -> 运算x++ y++ -> x = 1, y = 1, z = 0 |