我们知道,其实有很多地方不仅可以使用常数,也可以使用常数表达式,但是,就是因为使用常数表达式,而引起了很多错误,这些错误归结起来就是一个”坑“。
下面我们来砍看一道简单的运算题:
#define N 4
#define Y(n) ((N+2)*n) /*这种定义在编程规范中是严格禁止的*/
则执行语句:z = 2 * (N + Y(5+1));后,z的值为:
显而易见这里使用的是5+1替代函数中的n,就是这个替代的过程,会出现一些问题,当然如果你严格按照题目要求,一步一步的求解,不跳任何步骤,那么,这个问题就会被避免。首先应该注意的是函数表达式中的n未加括号,说这个的目的就是为了下面的运算。
将5+1带入得 :2*(4+((4+2)*5+1)=70;
注意这里是先乘以5再加上1,而不是直接乘以6…
那么同样的,还有一道题,类似这种类型的:
#define MAX_SIZE A+B
struct _Record_Struct
{
unsigned char Env_Alarm_ID : 4;
unsigned char Para1 : 2;
unsigned char state;
unsigned char avail : 1;
}*Env_Alarm_Record;
struct _Record_Struct *pointer = (struct _Record_Struct*)malloc
(sizeof(struct _Record_Struct) * MAX_SIZE);
当A=2, B=3时,pointer分配多少个字节的空间?
注意了,这里如果你说 MAX_SIZE 的值为5,那么你就错了,因为在这里是2+3,有人说,2+3不就是5吗?还是注意一下前面吧!前面还有一个 sizeof(struct _Record_Struct) 呢,所以这里应该注意到底最终的表达式中有没有在2+3这个常量表达式加括号,要是没有,那么,最后的结果会迥然不同,所以这里的结果是9,而不是15。
关于这个问题呢,或许面试题中会出现,这个坑很容易解决,但是,对于一些喜欢跳着走的人来说,也是难以逾越的鸿沟。不光如此,我们在写一些代码时或许也会遇到这种问题,那么最好的方法就是把你需要计算的表达式,按照先后顺序加上括号,这样就会避免这个错误。