题记:回头看看原本学过的知识,发现那些原本以为理解了的皮毛都突然让自己变得陌生。逐步学习,不懈努力。
测试题目时发现得出的结论与自己给出的不同,于是查阅资料,重新学习宏定义相关的文章。在C与C++编程中宏定义命令经常使用,不过常作为常量,而函数式则用的比较少。做题时以普通的函数理解方式进行解答,发现错误后及时更正,也提醒自己学习要扎实。
题目如下:#defineMAX(a,b)?a:bint test(){int a=3,b=2;return MAX(--a,b+++1);}请给出函数运行返回值。
这里要注意的是:若函数参数为表达式,则普通函数的调用与函数式宏定义的替换过程是不一样的。普通函数调用时为先求出实参表达式的值再传给形参,如果有++,--等操作只需要执行一次,而宏定义函数中则需要展开,如上题中MAX(--a,b+++1)在宏定义函数中的展开式为:result= (--a>b+++1)?--a:b+++1;执行次数未必为一次。以下为测试代码:
#define MAX(a,b) ((a>b)?a:b) #include <iostream> using namespace std; /* MAX(--a,b+++1)的展开式为: k=(--a>b+++1)?--a:b+++1; 执行时直接由b+++1 (3)(运算后b++变为3) 跳转至 b+++1 (变为4)(运算后b++ 变为4) --a 只执行一次 若为 MAX(--a,++b+1); ++b+1(3) ==> ++b+1 (5) */ int Test1() { int a=3,b=2; int k= MAX(--a,b+++1); cout<<"a= "<<a <<" b= "<<b<<endl; return k; } int Test2() { int a=3,b=2; int k= MAX(--a,++b+1); cout<<"a= "<<a <<" b= "<<b<<endl; return k; } int main() { int result1,result2; result1 = Test1(); result2 = Test2(); cout<<"Test1 :"<<result1 << " Test2 :"<<result2<<endl; return 0; }
参考:http://www.cnblogs.com/dong008259/archive/2011/12/27/2302625.html