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

#include<iostream.h>#defineMIN(a,b)((a)<(b))?(a):(b)voidmain(){inta=4,b=9;int*p=&a;in... #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
展开
 我来答
德库拉屑风
2008-08-23 · TA获得超过2903个赞
知道小有建树答主
回答量:405
采纳率:0%
帮助的人:440万
展开全部
那是个宏定义,凡是遇到 #define 后面的宏(此题为 MIN)即先完全代替,然后按照宏的运算法则运算。记住:先直接代换,不能先计算。
而 ((a)<(b))?(a):(b) 是个选择运算,即:先看前半部分,(a)<(b)成立不(注意要带上括号啊!),如果成立,即整个代表式的值为(a),若不成立即为(b)。这是个二元运算。
希望对你有帮助。
魔不影09
2008-08-23 · 超过15用户采纳过TA的回答
知道答主
回答量:72
采纳率:0%
帮助的人:41.8万
展开全部
#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++) ,这时候就是取 ( &a + 1 )的值.

为了试验,可以在a变量前面定义另一个变量 int d = 16;这时候,输出的应该是d的值。

建议:宏函数里面不要使用带有副作用的表达式。

C++里面可以用inline函数替换。

结论:int c=MIN(*p++,b)这句表达式本身写的就有问题,不关宏函数的事。

试验:

#include <iostream>
using namespace std;
#define MIN(a,b) ((a)<(b))?(a):(b)
int main(int argc, char* argv[])
{
int d = 16;
int a=4, b=9;
int *p=&a;
int c= MIN(*p++,b);
cout<<c<<endl;
return 0;
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
心中风情4
推荐于2016-12-01 · TA获得超过2247个赞
知道大有可为答主
回答量:1779
采纳率:66%
帮助的人:1090万
展开全部
因为#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);
应该就没问题了
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
bluelfster
2008-08-23
知道答主
回答量:15
采纳率:0%
帮助的人:0
展开全部
问题出在这句上: 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了。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式