看起来简单,做起来难!!!!高手指点!

diamond101 2003-10-20 06:21:33
int main()
{
int a=0,b=0,c=0,d=0,m=0,n=0,e;
e=(m=a==b)||(n=c==d);
return 0;
}

问,e ,m ,n 的值?
(最终答案出乎意料!)
在线等待!!!
...全文
39 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
linuxuer 2003-10-21
  • 打赏
  • 举报
回复
逻辑短路!
呵呵
NotReady 2003-10-21
  • 打赏
  • 举报
回复
1
-1
-1
catf1sh 2003-10-21
  • 打赏
  • 举报
回复
所以最要不要在逻辑判断里赋值,要赋值也要排在最前面才行。
PriMaryPeople 2003-10-21
  • 打赏
  • 举报
回复
UP TianGuangZao(天光早)
我也不明白计算机会这么计算。也许是为了走近路吧。省时间吧。可能当时计算机的硬件比较贵,怎样充分利用硬件发挥潜力,才是最主要的。请指教。
ZXEOC 2003-10-21
  • 打赏
  • 举报
回复
实际上是这样的:
编译器根据贪心算法从前往后扫描程序,当扫描完第一对括号后,因为括号的优先级最高,所以先计算括号里的表达式。根据贪心算法,接下来又读入“||”,根据“||”的运算规则,左面的表达式的值已经为1,所以右面的表达式不再进行求值。
这里需要说明的是:左面的表达式之所以值为1,不是因为m=1,而是表示赋值成功(上面好像没有人提到这一点)。
Bandry 2003-10-21
  • 打赏
  • 举报
回复
大哥,如果 || 前面为真,则后面的表达式一个也不会计算
相同,如果 && 前面为FALSE,则后面的表达式也不会计算

不要光考虑到什么运算符的优先级,表达式的值也需要一个一个计算啊,这个还没有计算完怎么可能去计算另外那个?
TianGuangZao 2003-10-21
  • 打赏
  • 举报
回复
纠正我话里的一个错误:
"同样编译器也会采取这种策略:"
不是编译器,应该是计算机。
diamond101 2003-10-21
  • 打赏
  • 举报
回复
如果根据“短路逻辑”的话,那符号的优先级不就成了摆设了吗?
至少在e=(m=a==b)||(n=c==d)表达式中是这样的!!!

说么说“括号”比“||”优先级高,计算时一定要按照优先级的顺序来进行运算,而真正进行运算么却是按照“短路逻辑”来进行!!

如果没有各位高手的指点,叫我这个初学者怎么理解呢???

郁闷!!!

悟出了个道理,理论要联系实际啊!!!呵呵
TianGuangZao 2003-10-20
  • 打赏
  • 举报
回复
diamond101():
这里就是 PriMaryPeople(C++学习者!) 讲的短路(short circuited)逻辑。
思考下面的一个布尔逻辑:
X = A + B
如果你知道 A 是 true,能判断 X 是 true 还是 false 吗?
不用多思考,你会答 true.

那么也就是说 B 是 true 还是 false 无关紧要。

同样编译器也会采取这种策略:
(m=a==b)||(n=c==d);
对于这条语句,它不会急于去计算括号里的表达式,而是先计算 || 左边的表达式,
如果 (m=a==b) 为 1, 那么也就没有必要去知道 (n=c==d) 具体为什么值了。
显然这样处理更有效率。

(不过我感觉计算机在这里偷懒了。)

再来看这个:
if(f() < 0) die();
可以写成:
f() < 0 && die();
这条表达式永远不会 die, 直到 f() 返回一个负数。
DESL 2003-10-20
  • 打赏
  • 举报
回复
晕来晚了该说的都说哩!!!顶一下吧.
diamond101 2003-10-20
  • 打赏
  • 举报
回复
各位大虾,我主要想不明白的是,既然括号的优先权大于||,可以说大于别的运算符
那么在计算表达式e=(m=a==b)||(n=c==d)时,是否是先计算括号里面的,然后在转而运算||呢?如果这么说成立的话,那么n的值就应该是1,但是现在实际做下来n=0啊!!
PriMaryPeople 2003-10-20
  • 打赏
  • 举报
回复
在全国计算机等级考试二级C语言书中对于“短路”问题有一个比较详细的介绍。可以看一下,好象是第二章。
up ttlb(小鸟___ttlb___)
up TianGuangZao(天光早)
linxiaoyong 2003-10-20
  • 打赏
  • 举报
回复
编译时,是从左到右进行扫描的,所以当扫描到‘||’时,且‘||’左边为真时,
就不再扫描下去了。
TianGuangZao 2003-10-20
  • 打赏
  • 举报
回复
to diamond101():
可以这样理解:
e=(m=a==b)||(n=c==d)
|| 优先级比 = 高没错。

(m=a==b)||(n=c==d)
=>
(1 || (n=c==d)) = 1;
=>
e = 1;
这样是不是很清楚。
diamond101 2003-10-20
  • 打赏
  • 举报
回复
0
diamond101 2003-10-20
  • 打赏
  • 举报
回复
to ttlb(小鸟___ttlb___) :

非常感谢你的指点,但是我有一点不明白,根据运算符的优先级,e=(m=a==b)||(n=c==d)表达式中是先运算括号里的表达式,因为括号拥有最高优先级啊,然后再进行||运算的啊,不会出现你说的如果||左边为真就不运算右边的情况啊!!
请赐教!!谢谢!
laomai 2003-10-20
  • 打赏
  • 举报
回复
这是逻辑短路的情况。你可以看看这个帖子。
http://expert.csdn.net/Expert/topic/2334/2334547.xml?temp=.9325678
ttlb 2003-10-20
  • 打赏
  • 举报
回复
不是已经说了吗?!!!!!!!!!!!
当||左侧为真的时候,就不计算右侧的值了。!!!!!!!!!!!!!!
所以n=(c==d)根本就没运行,运行到||就中止了。
diamond101 2003-10-20
  • 打赏
  • 举报
回复


先不说整个表达式的值是多少,为什么n的值会是0????????????而不是1???
sharkhuang 2003-10-20
  • 打赏
  • 举报
回复
这个叫什么断值什么的!记不清楚了哈
加载更多回复(5)

69,380

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧