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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© z82454642 中级黑马   /  2014-4-10 16:54  /  1859 人查看  /  13 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 z82454642 于 2014-4-16 22:48 编辑
  1. int main()
  2. {
  3.     int x,y,z;
  4.     x=y=z=0;
  5.     ++x || (++y && ++z);
  6.     printf("%d %d %d",x,y,z);
  7.    
  8.     return 0;
  9. }
复制代码


求解为何输出1 0 0

评分

参与人数 1黑马币 +2 收起 理由
jing迪 + 2

查看全部评分

13 个回复

倒序浏览
本帖最后由 悟中生有 于 2014-4-10 17:16 编辑

逻辑或:条件A || 条件B
如果条件A成立,就不会再去判断条件B是否成立:因为条件A已经成立了,不管条件B如何,“条件A || 条件B”的结果肯定是1,也就是“真”。
++x || (++y && ++z);  这行代码执行的效果是:++x是x先加1再参与运算,结果x==1,x等于1就是真,右边就不会再执行了,所以输出的就是:1 0 0

评分

参与人数 1技术分 +1 收起 理由
jing迪 + 1

查看全部评分

回复 使用道具 举报
int main()
{
    int x,y,z;
    x=y=z=0;
    ++x || (++y && ++z);
    printf("%d %d %d",x,y,z);
   
    return 0;
}
首先x = y = z = 0;是给 x y z赋值为0.
++x || (++y && ++z);执行到这一句的时候会判断++x是否为真,如果为真则不执行后面的代码。
++x是先给x自加1,则值为1,为真。所以不判断后面的条件。
直接执行输出语句,这个时候x值为1,而y和z还依然是原来的值。
所以输出的值是1  1  0
这里的重点是 或 运算是当第一个条件为真时直接执行后面的语句,不执行紧跟后面的条件,默认为真
同样的 与 运算是当第一个条件为假的时候也不执行后面的条件,默认为假。

评分

参与人数 1技术分 +1 收起 理由
jing迪 + 1

查看全部评分

回复 使用道具 举报
悟中生有 发表于 2014-4-10 17:12
逻辑或:条件A || 条件B
如果条件A成立,就不会再去判断条件B是否成立:因为条件A已经成立了,不管条件B如 ...

()不是提升运算级的么?而且&&的运算级不是高于||的么 为什么还会先去执行 ||
回复 使用道具 举报
啊康 发表于 2014-4-10 17:19
int main()
{
    int x,y,z;

()不是提升运算级的么?而且&&的运算级不是高于||的么 为什么还会先去执行 ||
回复 使用道具 举报
z82454642 发表于 2014-4-10 17:45
()不是提升运算级的么?而且&&的运算级不是高于||的么 为什么还会先去执行 ||  ...

如果没有()的话就是先执行&& ,加上()后(++y && ++z)相当于是一个条件,所以,是按照自左向右顺序执行的,这是我的个人理解。
回复 使用道具 举报
z82454642 发表于 2014-4-10 17:46
()不是提升运算级的么?而且&&的运算级不是高于||的么 为什么还会先去执行 ||
...

1+3+4*3

你觉得是先算1+3呢,还是4*3呢?

很显然先算1+3,然后才是4*3,最有才是4+12。

同理你的++X,为1了,后面碰到||符号,当然条件成立了,

回复 使用道具 举报
int main()
{
    int x,y,z;
    x=y=z=0;
    ++x || (++y && ++z);
    printf("%d %d %d",x,y,z);
   
    return 0;
}

条件A || 条件B
如果条件A成立,程序就不会向下继续走了,因为条件A已经成立了,不管条件B是否成立,“条件A || 条件B”的结果都为真。
因为++x为1,所以右边就不会执行了。
输出结果就为 1 0 0

评分

参与人数 1技术分 +1 收起 理由
jing迪 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 戴文婷 于 2014-4-11 10:17 编辑
  1. int main()
  2. {
  3.     int x,y,z;
  4.     x=y=z=0;
  5. //++x ,++在变量前,意思是说。在使用变量前,先执行x=x+1,操作。
  6. //所以在这句 ++x || (++y && ++z);时,x的值是1
  7. // || 运算符,如果|| 之前的表达式为1也就是真的时候,||之后的表达式,也就不判断与运算。
  8. //所以在这里是,<span style="line-height: 1.5;">进行x=x+1 操作,</span><span style="line-height: 1.5;">||判断到x为1,就直接运行到;号。++y,++z没有执行。</span>
复制代码

//++x, ++在变量前,意思是说。在使用变量前,先执行x=x+1,操作。
//所以在这句 ++x || (++y && ++z);时,x的值是1
// || 运算符,如果|| 之前的表达式为1也就是真的时候,||之后的表达式,也就不判断与运算。
//所以在这里是,进行x=x+1 操作,||判断到x为1,就直接运行到;号。++y,++z没有执行。




特别注明: ||运算符,是,两边都为真时 结果为真,有一边为真是,结果也为真,只有当两边都是假时才输入假

true||ture 输出 true

true||false 输出 true

false||true 输出 true

false||false 输出 false


所以,当||之前的表达式为false时,还不能确定||之后的是 true还是false ,也就是不能确定究竟是输出true 还是false,编译器还是会执行||之后的表达式。

但如果 ||之前就是ture,那输出就能确定了。不需要再执行后面的表达式了。直接跳到; 输出ture.



刚写错了。现在改了下

评分

参与人数 1技术分 +1 收起 理由
jing迪 + 1

查看全部评分

回复 使用道具 举报
int main()
{
    int x,y,z;
    x=y=z=0;
    ++x || (++y && ++z);
    printf("%d %d %d",x,y,z);
   
    return 0;
}

首先  x=y=z=0;的优先级相同,从左至右开始运算,所以x、y、z都等于0;
其次判断  ++x || (++y && ++z);
   关系运算符优先级小于算数运算符,如果右边没有括号,则选算&&,但是因为这个地方有(),所以导致先从左开始算:
   || 代表或运算,只有一个为真,结果就为真,而且如果左边为真,右边就不会进行运算,因为左边为真,结果就肯定为真;
  ++x的意思是先将x加1,然后再将x进行运算,本来x是0,现在加1,所以左边就为真,整个结果就为真,右边就不会进行运算,所以右边不管怎么赋值,都不会影响结果,
所以输出的结果是1 0 0

评分

参与人数 1技术分 +1 收起 理由
jing迪 + 1

查看全部评分

回复 使用道具 举报
星河鹭起 发表于 2014-4-11 10:44
int main()
{
    int x,y,z;

这个有括号和没括号效果是一样的。。没区别
我的理解是表达式是从左往右运算的。。优先级只是相对的,并不是绝对的。。。。自己写代码的时候尽量要避免这种恶心的代码。。。
回复 使用道具 举报
z82454642 发表于 2014-4-11 21:49
这个有括号和没括号效果是一样的。。没区别
我的理解是表达式是从左往右运算的。。优先级只是相对的,并 ...

那是有区别的,优先级是这样排序的 算术运算>关系运算>逻辑运算。||是关系运算,&&是逻辑运算。
回复 使用道具 举报
星河鹭起 发表于 2014-4-11 23:32
那是有区别的,优先级是这样排序的 算术运算>关系运算>逻辑运算。||是关系运算,&&是逻辑运算。 ...

||和&&都是逻辑运算...
回复 使用道具 举报
逻辑或:一真则真,左边表达式为真,右边表达式就不会进行判断执行了
逻辑与:一假则假,左边表达式为假,右边表达式就不会进行判断执行了
++x || (++y && ++z);
虽然&&运算符的优先级高于||,但是程序在这里是将(++y && ++z)整个看作一个表达式的,判断逻辑或左边的表达式++x为真后,右边的表达式就不会再进行判断执行了,++x || (++y && ++z);和++x || ++y && ++z;的执行结果是一样的!

评分

参与人数 1技术分 +1 收起 理由
jing迪 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马