黑马程序员技术交流社区
标题:
C语言基础知识 小疑惑
[打印本页]
作者:
machao610
时间:
2014-5-11 22:08
标题:
C语言基础知识 小疑惑
7.执行以下语句后,x、y和z 的值分别为_________。
int x,y,z;
x=y=z=0;
++x || ++y && ++z;
printf("%d,%d,%d",x,y,z);
作者:
liulinjie
时间:
2014-5-11 23:22
本帖最后由 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
作者:
詹绪长
时间:
2014-5-12 16:24
楼上说的很好,这是一个优先级问题,具体运算法则的优先级你可以问问百度一下。
作者:
吉大人
时间:
2014-5-12 18:45
操作符优先级很重要
作者:
为梦想挺身而出
时间:
2014-5-12 21:21
返回值跟变量赋值后的值是不一样的:lol
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2