我有以下代码:
#define MIN(a,b) (a <= b ? a : b)
void main()
{
int a = 5;
int* p = &a;
int result = MIN(*p++,12);
printf("%i",result);
}
理论上,输出应该小于12,但结果是34。所以我想知道内联函数或指针有什么问题吗?
顺便说一句,我的意思是*p++
而不是(*p)++
。我知道它会增加地址并取消装箱。
所以另一个问题通常是下一个地址的价值是什么?在这种情况下,*p++
的价值是什么?
答案 0 :(得分:3)
这一行:
int result = MIN(*p++,12);
扩展为:
int result = (*p++ <= 12 ? *p++ : 12);
^^^^ ^^^^
所以p
增加两次,返回的值是垃圾(注意这实际上是未定义的行为)。
这就是为什么强烈建议不要使用这些宏 - 你真的不想要这样令人讨厌的副作用。
使用正确的内联函数而不是宏:
inline int MIN(int a, int b)
{
return a <= b ? a : b;
}