&符号在C语言中有两种含义
时间:10-02
整理:3721RD
点击:
&符号在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;
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;
好东西,支持了
!=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