&符号在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;
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>