(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语言整型提升)。