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

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 的值?
(最终答案出乎意料!)
在线等待!!!
...全文
32 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)
博乐—机器人表演 机器人演出的开拓者 www.boole-tech.com 1 DIY 机器人 第一课 制作机器人的基础 在论坛上经常可以看到有人说:"我是菜鸟,制作机器人需要什么基础?"。其 实我可以回答大家:"基础就是你首先要学好数理化",怎么样很意外吧!现在 我来给大家讲讲为什么这么说。机器人制作综合性很强,它涉及机械制造、计 算机、电子技术等很多领域,每一个领域都是以我们的数理化为基础的,还有就 是要充分利用互联网的资源自我学习。 以下是我在论坛发过的一篇贴子,希望大家用心体会。 高手的秘诀 1.不要看到别人的回复第一句话就说:给个代码吧!你应该想想为什么。当你自己想 出来 再参考别人的提示,你就知道自己和别人思路的差异。 2.别小家子气,买本书几十块都舍不得,你还学个 P。为了省钱看电子书,浪费的时间绝对 超过书的价值。当然如果查资料,只能看 PDF。 3.学习新的开发软件时,一定要看帮助手册。买的书不够全面。刚接触一个软件,什么都不 懂,就盲目的问东问西,让人起来很幼稚。 4.不要蜻蜓点水,得过且过,细微之处往往体现实力。 5.把时髦的技术挂在嘴边,还不如把过时的技术记在心里。 6.看得懂的书,请仔细看;看不懂的书,请硬着头皮看。 博乐—机器人表演 机器人演出的开拓者 www.boole-tech.com 2 .别指望看第一遍书就能记住和掌握什么——请看第二遍、第三遍。 7.多实践,去焊板子、调试,去写去调,只用软件模拟,是永远成不了高手的。 8.保存好你过的所有的源程序、PCB、原理图等----那是你最好的积累之一。 9.对于网络,还是希望大家能多利用一下,很多问题不是非要到论坛来问的, 首先你要学会 自己找答案,比如 google、百度都是很好的搜索引擎,你只要输入关键字就 能找到很多相 关资料,别老是等待别人给你希望,看的出你平时一定也很懒! 10 到一个论坛,你学会去看以前的帖子,不要什么都不看就发帖子问,也许你的问题早就 有人问过了,你再问,别人已经不想再重复了, 为初学者,谁也不希望自己的帖子没人回 的。 11,虽然不是打击初学者,但是这句话还是要说:论坛论坛,就是大家讨论的地方,如果 你 总期望有高手总无偿指点你,除非他是你亲戚!! 讨论者, 起码是水平相当的才有讨论的说 法,如果水平真差距太远了,连基本操作都需要别人给解答,谁还跟你讨论呢。 什么样的人是浮躁的人? 浮躁的人容易问:我到底该学什么; ----踏踏实实的学点基本的吧?单片机不知道是什么就想去学 ARM? c 语言不会想搞 LINUX?别老是好高骛远。 浮躁的人容易问:谁有 xxx 源码?--(你给人家多少钱啊?自己的劳动白送你?) 浮躁的人容易说:跪求 xxx ---(就算网络也要点尊严吧?) 浮躁的人容易说:紧急求救---(其实只是个简单的课程设计) 浮躁的人容易说:有没有 xxx 中文资料?---一个字:懒。别说别的。E 文不行?谁不是 博乐—机器人表演 机器人演出的开拓者 www.boole-tech.com 3 从 ABC 学起的啊? 浮躁的人容易说:求 xxx,我的 email 是 xxx@xxx.com,然后消失 ---- 你以为你是大爷啊, 人 家请你吃饭,还要喂到你口里不成? 浮躁的人容易问:单片机有钱途吗----只是为了钱,搞不好技术的,你去抢银行好了。 浮躁的人容易说:哪里有 xxx 芯片资料?(其实大部分资料网络上都有,但是偏偏来找人 问,懒!) 浮躁的人分两种:只观望而不学的人;只学而不坚持的人; 浮躁的人永远不是一个高手。 lamp 看完后明白了吧,恭喜!你已经迈出了第一步。 第一课就到这里,下课接着讲。 _________________ 第二课 机器人的组成 机器人一般是由以下模块组成: 1.语音模块 用于语音对话、语音控制。 2.灯光表达模块 用于机器人状态显示、感情表达(喜、怒、哀、乐) 3.控制模块 I/O+决策,即机器人的大脑,其控制能力及 AI 由编程者的水平决定。 博乐—机器人表演 机器人演出的开拓者 www.boole-tech.com 4 4.传感器模块 对外界环境的的感知。 5.电源模块 为机器人提供能源,常用有 3v、5v、6v、9v、12v。 6.减速电机 常用于机器人行走驱动,根据需要选择变比。 7.驱动模块 机器人的执行机构,常选用行模中的舵机。 8.视频模块 机器人的眼 9.机械模块 10.无线通讯模块 11.控制软件 一个简单的机器人是由单片机电路、红外传感器、减速电机+程序这是大多数人 认同的,但是我要向大家说这种认识是错误的,真正的机器人不是几片单机和 几台电脑就可以解决,关键就是'机器人'中这个'人'字,还需要我们一代代 的努力。 以上讲的有点简单,先写出。 --

69,369

社区成员

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

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