一个预处理的有关问题,帮看看

一个预处理的问题,帮看看。
#include <iostream>
using namespace std;
#define MIN(a,b) ((a<b) ? a:b)
int main()
{
int a = 1,b = 2;
int *p = &a;
cout<<MIN(*p++,b)<<endl;
return 0;
}
运行结果是1245120,为什么不是1呢?如果是求a > b ? a : b的话,得到的却是2.为什么?

------解决方案--------------------
*p++
------解决方案--------------------
C/C++ code

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

------解决方案--------------------
改成*p就行了,*p++的话要加个括号(*p)++自右向左结合,

但是这样的话a也等于2了,就没1了。
------解决方案--------------------
不是这个问题啊。。。

探讨

C/C++ code

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


不要吝啬括号,加上括号在测试一下。

------解决方案--------------------
宏只能替换,比如同样的 func ( p ++ ) ;func 是宏和func 是函数 两个完全不同!
------解决方案--------------------
*p++ < b 完成后 ,p指向下一个地址 ,*p值未定义。

------解决方案--------------------
#define MIN(a,b) ((a<b) ? a:b)
首先这个有问题,加上括号,否则早晚出问题
#define MIN(a,b) (((a)<(b)) ? (a):(b))

另外*p++,改成(*p)++
------解决方案--------------------
探讨

#define MIN(a,b) ((a<b) ? a:b)
首先这个有问题,加上括号,否则早晚出问题
#define MIN(a,b) (((a)<(b)) ? (a):(b))

另外*p++,改成(*p)++

------解决方案--------------------
这。。。。。。。。。。。。。。。。。。。。。

探讨

引用:

#define MIN(a,b) ((a<b) ? a:b)
首先这个有问题,加上括号,否则早晚出问题
#define MIN(a,b) (((a)<(b)) ? (a):(b))

另外*p++,改成(*p)++


*p ++ 和 (*p) ++是一样的,他的这个问题就是 宏函数参数传递问题
我还是哪句话,func (p++),func 宏函数……

------解决方案--------------------
探讨
#include <iostream>
using namespace std;
#define MIN(a,b) ((a<b) ? a:b)
int main()
{
int a = 1,b = 2;
int *p = &amp;a;
cout<<MIN(*p++,b)<<endl;
return 0;
}

------解决方案--------------------
我都说了是宏函数传参数的问题,给分 ((*^__^*) 嘻嘻……)

C99有个特性 既有define ,也有类型检查, inline 函数(__inline )
------解决方案--------------------
[Quote=引用:]
1、a和b是在函数内部定义的临时变量,都是保存在栈上面的,
2、a和b定义时是挨着定义的,压栈自然就压在了一起,地址也就是挨着的了
3、至于a和b谁在高地址,谁在低地址,不同的处理器,不同的操作系统不一样
------解决方案--------------------
探讨
改成*p就行了,*p++的话要加个括号(*p)++自右向左结合,

但是这样的话a也等于2了,就没1了。

------解决方案--------------------
探讨

引用:
改成*p就行了,*p++的话要加个括号(*p)++自右向左结合,

但是这样的话a也等于2了,就没1了。

我觉得是正解

------解决方案--------------------
编译选项加/EP /P,重新编译,查看宏展开后对应的.i文件。

------解决方案--------------------
C/C++ code

    char *p = "fbc";
012713BE  mov         dword ptr [p],1275858h  

    *p ++;
012713C5  mov         eax,dword ptr [p]  
012713C8  add         eax,1  
012713CB  mov         dword ptr [p],eax  
    (*p)++;
012713CE  mov         eax,dword ptr [p]  
012713D1  mov         cl,byte ptr [eax]  
012713D3  add         cl,1  
012713D6  mov         edx,dword ptr [p]  
012713D9  mov         byte ptr [edx],cl