#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 展开
#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 展开
4个回答
展开全部
#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;
}
*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;
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
因为#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);
应该就没问题了
所以
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了。
一般在宏定义的应用时不要使用如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了。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询