微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > &符号在C语言中有两种含义

&符号在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;

好东西,支持了

!=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

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top