C51 等于“==”以及运算优先级的问题 有点奇怪

[复制链接]
 楼主| gdmgb520 发表于 2010-2-4 17:02 | 显示全部楼层 |阅读模式
今天调程序(Keil C),怎么调都通不过,后来在debug里面发现了如下问题。但是我没有搞明白这到底是怎么回事。希望大家有空看看,指点一下。
我得到的经验和教训就是,不管表达式多简单,优先运算的一定加括号。

看下面的两个表达式:(一下表达式和结果是在OutPut Window 的Command选项卡里输入和得到的)
表达式一:(dat2[0]&temp)==0
运算结果:0x0001
表达式而:dat[0]&temp==0
运算结果:0x0000
其中,dat2[0]的值是0x00,temp的值是0x01。
而输入dat2[0]&temp的结果是0x0000。


然后,我有测试了一下两个表达式:
表达式一:0x00&0x01==0
运算结果:0x0000
表达式二:(0x00&0x01)==0
运算结果:0x0001


这是什么原因呢?
cauhorse 发表于 2010-2-4 18:46 | 显示全部楼层
&:按位与
==:等于
"=="的优先极比"&"来得高,故而:
表达式1中,先判断"0x01==0"不成立,后与0x00相与,最终为0;
表达式2中,因为有括号运算符的存在,先计算"0x00&0x01",与的结果是0,随后判断"0==0",结果为真。
赤铸 发表于 2010-2-4 19:14 | 显示全部楼层
表达式“0x01==0”的值是0,所以“0x00&(x01==0)完全等同于“0&0”
优先级就是个人为规定,当然也有一定道理,就是“符合一般习惯”
多数情况下,逻辑判断里 (a==b) && (c==d) 这样的组合比较多,所以规定 == 优先级比 && || 高,方便

位运算显得比较“低级”,比较“汇编”,多用于硬件控制或代码优化之类,也许C语言的设计者认为没必要定那么高优先级?
 楼主| gdmgb520 发表于 2010-2-8 14:07 | 显示全部楼层
恩,明白了,谢谢两位的解答。
这两天有点忙,那天发了贴就一直没有过来。
呵呵呵
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:了解新东西才知道自己的不足。 www.elecbench.com

67

主题

452

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部