一个预处理的有关问题,帮看看
一个预处理的问题,帮看看。
#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++
------解决方案--------------------
#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了。
------解决方案--------------------
不是这个问题啊。。。
------解决方案--------------------
宏只能替换,比如同样的 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)++
------解决方案--------------------
------解决方案--------------------
这。。。。。。。。。。。。。。。。。。。。。
------解决方案--------------------
------解决方案--------------------
我都说了是宏函数传参数的问题,给分 ((*^__^*) 嘻嘻……)
C99有个特性 既有define ,也有类型检查, inline 函数(__inline )
------解决方案--------------------
[Quote=引用:]
1、a和b是在函数内部定义的临时变量,都是保存在栈上面的,
2、a和b定义时是挨着定义的,压栈自然就压在了一起,地址也就是挨着的了
3、至于a和b谁在高地址,谁在低地址,不同的处理器,不同的操作系统不一样
------解决方案--------------------
------解决方案--------------------
------解决方案--------------------
编译选项加/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