#define MIN(a,b) ((a)<(b))?(a):(b)解释

来源:百度知道 编辑:UC知道 时间:2024/06/02 19:00:59
#include <iostream.h>
#define MIN(a,b) ((a)<(b))?(a):(b)
void main()
{
int a=4, b=9;
int *p=&a;
int c=MIN(*p++,b);
cout<<c<<endl;
}
为何输出为1245120

因为#define MIN(a,b) ((a)<(b))?(a):(b)
所以
c=MIN(*p++,b) = ((*p++)<(b))?(*p++):(b)

注意这里p加了两次,开始p指向a,后来就不知道指向的是那个地址,因为第二次取值的时候地址已经加了1,如此再得到的(*p)就是一个随机值了(具体内存如何操作其实我也不清楚)

如果改成:int c=MIN( (*p)++,b);
应该就没问题了

问题出在这句上: MIN(*p++,b)
一般在宏定义的应用时不要使用如a++,++a之类的复合表达时,因为按上句展开宏就变成了 int c = ((*p++)<(b))?(*p++):(b)
运行过程大致如下
1.判断(*p++)<(b) 即 4<9, 成立 p的内存地址+1 (指向某一个不定的地址空间)
2.然后运行?后面的 *p++,取出1中p指向的内存的地址里面的数据赋值给c
cout出来的就是*(p+1)的数据
为了验证上述说法,你可以在int *p = &a; 后面加上 *(p+1) = 1234;
再次编译运行,输出的就是1234了。

那是个宏定义,凡是遇到 #define 后面的宏(此题为 MIN)即先完全代替,然后按照宏的运算法则运算。记住:先直接代换,不能先计算。
而 ((a)<(b))?(a):(b) 是个选择运算,即:先看前半部分,(a)<(b)成立不(注意要带上括号啊!),如果成立,即整个代表式的值为(a),若不成立即为(b)。这是个二元运算。
希望对你有帮助。

#define MIN(a,b) ((a)<(b))?(a):(b) 是个宏函数,用这个函数的时候,MIN(*p++,b)就会在原地展开为 ((*p++)<(b))?(*p++):(b)
*p++的意思是先取p指向的值,就是a,这个表达式的值为4。但是有副作用,p不再指向a,而是指向( &a + 1 ).
((*p++)<(b))表达式的值为真,所以要执行?后面的 (*p++) ,这时