读书人

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

发布时间: 2012-05-12 15:39:31 作者: rapoo

一个预处理的问题,帮看看。
#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 = &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 

读书人网 >C语言

热点推荐