&符号在C语言中有两种含义

2019-07-15 17:01发布

&符号在C语言中有两种含义:①取地址;②按位与;问题就来了。本人近期有一段程序其中有一条:        if(addr&3 != 0)adh_block[addr>>2]<<=2;

if括号中的“addr & 0x3 !=0”我的本来用意是将addr变量先与常数0x3进行按位与运算然后再判断结果是否为非零。
结果写出来之后0x3总是被识别成RAM中的0x3单元,这个问题很难被发现。在查C语言操作符优先级的时候由于没仔细看,把取地址的运算优先级当成了按位与,一直以为按位与&的优先级要大于关系判断符!=。
       后来才发现&作为取地址运算符时优先级是比关系判断符要高的,但是如果作为按位与时运算优先级是很低的,居然比关系判断符都低
所以if(addr&3 != 0)adh_block[addr>>2]<<=2;应改为:if((addr&3) !=0)adh_block[addr>>2]<<=2;
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
3条回答
shipeng
2019-07-15 21:03
本帖最后由 shipeng 于 2015-6-13 09:23 编辑
qq553605454 发表于 2015-5-25 16:25
!=0干嘛不直接去掉呢。。。

这样也可以,更简洁了,但是我有一个程序:if(flag.time.over!=0 && flag.time.ray!=0)display(pass.word0,pass.word1,pass.word2);编译后程序空间会比if(flag.time.over & flag.time.ray)display(pass.word0,pass.word1,pass.word2);少7条指令。编译器为:Microchip MPLAB XC8 C Compiler (Free Mode) V1.34。受这个影响我更尽量在判断语句里面加!=0

一周热门 更多>