c语言中的一个坑(2+3 != 5)

我们知道,其实有很多地方不仅可以使用常数,也可以使用常数表达式,但是,就是因为使用常数表达式,而引起了很多错误,这些错误归结起来就是一个”坑“。
下面我们来砍看一道简单的运算题:

 #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。

关于这个问题呢,或许面试题中会出现,这个坑很容易解决,但是,对于一些喜欢跳着走的人来说,也是难以逾越的鸿沟。不光如此,我们在写一些代码时或许也会遇到这种问题,那么最好的方法就是把你需要计算的表达式,按照先后顺序加上括号,这样就会避免这个错误。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值