C“陷阱”

(1)#define问题

#define   宏常量,无语法检测,只是字符替换

#define Max(a,b)   (a)>(b) ? (a):(b)     //错误

Result = Max(i,j) +2;

结果 Result = (a)>(b) ? (a):(b)+2  ===> (a)>(b) ? (a):((b)+2)

#define Max(a,b)   ((a)>(b) ? (a):(b))    //正确

高招:    #define XX do{......;}while(0) 

(2)优先级问题

a = b<<8 + c;   ===》a =b<<(8+c);  //错误

a = (b<<8) +c;          //正确 

*p++,由于++和*同优先级,结合方向自右而左,等价于*(p++)。 

(3)各类数值型数据之间的混合运算问题

long i;

int m ,n;

i= m*n;   //错误

i = (long)m*n;   //正确

变量的数据类型是可以转换的。转换的方法有两种,一种是自动转换,一种是强制转换。自动转换发生在不同数据类型的量混合运算时,由编译系统自动完成。自动转换遵循以下规则:

1) 若参与运算量的类型不同,则先转换成同一类型,然后进行运算。

2) 转换按数据长度增加的方向进行,以保证精度不降低。如int型和long型运算时,先把int量转成long型后再进行运算。

3) 所有的浮点运算都是以双精度进行的,即使仅含float单精度量运算的表达式,也要先转换成double型,再作运算。

4) char型和short型参与运算时,必须先转换成int型。

5) 在赋值运算中,赋值号两边量的数据类型不同时,赋值号右边量的类型将转换为左边量的类型。如果右边量的数据类型长度左边长时,将丢失一部分数据,这样会降低精度,丢失的部分按四舍五入向前舍入。 

(4)野指针问题

int * p;

*p = 0x1122;

由于未给指针给特定的地址,导致指针指向的内存不确定性,如果正好指向的内存是被其他变量等使用,则可能导致问题。 

(5)“栈内存”指针问题

char *GetString(void)

{

char p[]=”hello”;

return p;

}

不要用return 返回“栈内存”指针,该内存在函数接收时自动消亡 

(6)隐藏的类型转换

1.例子一

unsigned char recsum,xorsum;

recsum == 0xFF; 

xorsum == 0x00;

if(recsum != (xorsum-1))  //这时候不相等 

2.例子二

UINT8   Buffer[2];

UINT16 TempNum;

TempNum=Buffer[0]<<8 | Buffer[1];   //正确 

根据C语言标准,<<运算要求操作数至少是int,如果不满int,自动转换成int(C语言整型提升)。

粽子糖果 发表于09-06 10:14 浏览65535次
分享到:

已有0条评论

暂时还没有回复哟,快来抢沙发吧

添加一条新评论

只有登录用户才能评论,请先登录注册哦!

话题作者

粽子糖果
粽子糖果(总统)
金币:41624个|学分:51977个
立即注册
畅学电子网,带你进入电子开发学习世界
专业电子工程技术学习交流社区,加入畅学一起充电加油吧!

x

畅学电子网订阅号