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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

  1. #include <stdio.h>

  2. int main(int argc, char *argv[])
  3. {
  4.         int x, y, z, result;
  5.         x = y = z = result = 0;

  6.         result = ++x || ++y && z++;
  7.        
  8.         return 0;
  9. }
复制代码


老实说自增的运算级别高,所以先执行++a,但这之后的&&比||的优先级高呀,为什么先判断了++a||为逻辑或短路,后面的没有执行? 不是应该先判断 (++y)&&(z++)么?

6 个回复

倒序浏览
你理解有误,就是这么判断的,世界上唯一正确的就是计算机输出的结果
回复 使用道具 举报
本帖最后由 cui0wei0 于 2015-5-11 01:45 编辑

因为你代码就是错的啊, 你没看见 Xcode 报警告么? 怎么有正确的结果呢? 你给 result 赋值 ++x||++y&&++z (因为=号优先级比&&还要低).
你在顺序表达式里写逻辑表达式, 就好像你要大号, 老师给你100块钱, 本来意思是让你去买卫生纸, 但是他没跟你说, 你就理解成直接用钱擦. 就是这么直接
计算机都不知道到你要判断什么, 只好从左向右直接读了. &&现在是在 || 右边, 左边 x+1成立了, 就没必要执行||后面的东西{:2_33:}.
你写的东西实际上就是是 result = ++x;
你换成这样 result = ( ( ++y && ++z ) || ++x ); 你在搞成 result = ++z&&++y||++x, result 的结果都成了bool 类型的了





回复 使用道具 举报
本帖最后由 cui0wei0 于 2015-5-11 00:53 编辑

  1. 优先级               
  2. ++, –– (用作前缀); (), +, –(一元), !, ~ *,/,%
  3. +, –
  4. <<, >>
  5. <,>,<=,>= ==, !=
  6. &
  7. ˆ
  8. |
  9. &&
  10. ||
  11. =, *=, /=, %=, +=, -=, <<=, >>=, &=, ˆ =, |=
  12. ++, – – (用作后缀)
复制代码
                                                                       
回复 使用道具 举报
cui0wei0 发表于 2015-5-11 00:42
因为你代码就是错的啊, 你没看见 Xcode 报警告么? 怎么有正确的结果呢? 你给 result 赋值 ++x||++y&&++z ( ...

打印出result,x,y,z的值是1,1,0,0
把一个表达式赋值给一个变量为什么会有问题呢?

视频中,老师刚开始说&&的优先级高于||,所以在老师讲的这个表达式里,我只是想知道为什么先从||开始判断了
回复 使用道具 举报
cui0wei0 发表于 2015-5-11 00:42
因为你代码就是错的啊, 你没看见 Xcode 报警告么? 怎么有正确的结果呢? 你给 result 赋值 ++x||++y&&++z ( ...

和同事讨论过后理解了
系统先做了结合性判断也就是
(++x)||(++y&&z++)
所以计算了++x为1后,后面就没有判断
回复 使用道具 举报

:handshake还是多谢你了,写了这么多
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马