A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© machao610 中级黑马   /  2014-5-11 22:08  /  1712 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

7.执行以下语句后,x、y和z 的值分别为_________。
int x,y,z;
x=y=z=0;
++x || ++y && ++z;
printf("%d,%d,%d",x,y,z);

评分

参与人数 1技术分 +1 收起 理由
脸皮猴 + 1

查看全部评分

4 个回复

倒序浏览
本帖最后由 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

评分

参与人数 1技术分 +1 收起 理由
脸皮猴 + 1 很给力!

查看全部评分

回复 使用道具 举报
楼上说的很好,这是一个优先级问题,具体运算法则的优先级你可以问问百度一下。
回复 使用道具 举报
操作符优先级很重要
回复 使用道具 举报
返回值跟变量赋值后的值是不一样的:lol
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马