一个预处理的有关问题,帮看看
一个预处理的问题,帮看看。#include iostreamusing namespace std#define MIN(a,b) ((ab) ? a:b)int ma
一个预处理的问题,帮看看。 #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