黑马程序员技术交流社区

标题: 关于运算问题 [打印本页]

作者: 黄莉萍    时间: 2014-6-5 19:52
标题: 关于运算问题
本帖最后由 黄莉萍 于 2014-6-5 22:06 编辑

int x = 1,y = 1;
if(x++==2 && (++y==2 || ++x >3 )) {
    x =7;
}
printf("x=%d, y=%d\n", x, y);

刚做这题时我的答案是x=2,y=2,看了答案却是x=2,y=1,为什么y的值是1呀,按运算顺序不是应该先算括号里面的吗?
作者: 夏沫的黄昏′    时间: 2014-6-5 20:11
因为x不等于2  后面的就不用算了  不会走的
作者: bubuatt    时间: 2014-6-5 20:28
求大神,看晕了
作者: 黄莉萍    时间: 2014-6-5 20:46
夏沫的黄昏′ 发表于 2014-6-5 20:11
因为x不等于2  后面的就不用算了  不会走的

不是该先算小括号里面的嘛?
作者: 张家伟2014    时间: 2014-6-5 21:22
本帖最后由 张家伟2014 于 2014-6-7 21:02 编辑

首先复习两个知识点:
一、逻辑与
格式:条件A && 条件B
运行过程:
总是先判断条件A是否成立,
如果条件A成立,接着会再判断条件B是否成立,如果条件B成立,结果为1,即真。如果条件B不成立,结果为0,即假。
如果条件A不成立,不会再判断条件B是否成立,因为无论条件B如何,结果都为0,即假。
二、x++的运算过程:
先将x的值拷贝出来一份,然后对x执行+1操作,最后将拷贝出来的值返回。
下面来对号入座:
  1. x++ == 2 && (++y == 2 || ++x > 3)
复制代码
条件A:x++ == 2
条件B:(++y == 2 || ++x > 3)
运算过程:
先判断条件A是否成立,根据运算符优先级,可知首先进行运算的是x++,先将x的值拷贝出来一份(拷贝出来的值为1),然后对x执行+1操作(此时x的值为2),最后将拷贝出来的值返回,即1 == 2,为假,如果条件A不成立,不会再判断条件B是否成立,所以y没有进行任何操作,值为初值。


作者: 黄莉萍    时间: 2014-6-5 22:01
张家伟2014 发表于 2014-6-5 21:22
复习两个知识点:一)逻辑与格式:条件A && 条件B
运行过程:总是先判断条件A是否成立。如果条件A成立,接 ...

谢谢,明白了
作者: 夏沫的黄昏′    时间: 2014-6-5 22:19
黄莉萍 发表于 2014-6-5 20:46
不是该先算小括号里面的嘛?

判断语句的话 是从左向右运算的
作者: 黄莉萍    时间: 2014-6-5 22:50
谢谢哈,现在弄清楚了,问题出在逻辑与和逻辑或关系运算上,逻辑与的优先级大于逻辑或,而逻辑或是一个整体,所有先判断x++==2,而这条件不成立就不进行后面的判断了。。
作者: 王海江1    时间: 2014-6-5 23:21
亲们,把我弄迷糊了。
x+=2——>x=x+2,这个我知道。
但是,x++=2,这个怎么转化我还是不知道。请指教
作者: ★Joean_Zhou    时间: 2014-6-5 23:32
学习了。。。。嘿嘿




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2