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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© qq358556392 中级黑马   /  2015-7-3 13:00  /  1898 人查看  /  12 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 qq358556392 于 2015-7-3 13:11 编辑

还在看基础视频,一个逻辑运算短路的问题一直有点疑惑,
视频里讲的如下
#include<stdio.h>
int main ( ){
     int x,y,z;
    x=y=z=0;
    result=++x || y++ && ++z;                        
    printf("result = %d\n",result);                          //这里输出result = 1
    printf("x = %d,y = %d, z = %d\n",x,y,z);          //这里输出x = 1,y = 0,z = 0
    return 0;
}
自增运算优先级为2,先算自增没问题,
但是 && 的优先级为11,而 | | 的优先级为12,先运算的是 y++ && ++z,就不存在&&短路的情况,而是||被短路。
最后输出的应该x = 0,y = 1,z = 1
然而最终输出的是x = 1,y = 0,z = 0,是&&被短路后的结果。
疑惑就是:短路不符合优先级的规则啊?

12 个回复

倒序浏览
没人来?
回复 使用道具 举报
result=++x || y++ && ++z;  
你这么想,自增是最优先的。
所以执行这一句的时候先从左到右 result = ++x ,这里x先自加1,x=1了  ,再执行到 "||",这里程序已经结束了。
有真为真,result直接被赋值1了,也就是说后面有没有&&已经不重要了。程序根本不用管以后的,也不管你"||"和"&&"优先级问题。
程序是执行到 "result = 1 ||" 已经结束。
回复 使用道具 举报
heyuze 发表于 2015-7-3 15:36
result=++x || y++ && ++z;  
你这么想,自增是最优先的。
所以执行这一句的时候先从左到右 result = ++x  ...

谢谢,大概能理清楚了,
回复 使用道具 举报
yangzhen5352 来自手机 中级黑马 2015-7-3 16:17:17
报纸
顶顶顶顶现在……
回复 使用道具 举报
我也是这个困惑,不过应该就跟3楼的说法一样,属于电脑运行的机制问题吧。。。
回复 使用道具 举报
在执行一条语句之前,计算机会先逐个扫描一遍。如果都为真,则会根据优先级来算,否则就不会按照优先级的运算规则。。
回复 使用道具 举报
我当时也是有点疑惑
回复 使用道具 举报
多多提问,会有大神解答的
回复 使用道具 举报
楼主在细节扣的太死了,面向对象时会很痛苦的。
回复 使用道具 举报
tao13yang 发表于 2015-7-4 00:16
楼主在细节扣的太死了,面向对象时会很痛苦的。

不扣细节,面向对象好学的话,我就不扣了
回复 使用道具 举报
之前一直不懂来着。
回复 使用道具 举报
过来看看,顺便向大神学习
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马