带参数的宏的问题

来源:互联网 发布:大数据分析网站 编辑:程序博客网 时间:2024/05/20 19:16
#include "iostream"using namespace std;#define COMPUTE_XX(a) ((a)*(a) + (a)/2)int main(){int a = 2;int test1 = COMPUTE_XX(++a); cout<<test1<<endl;  //test1的值为27/*分析:编译时完整替换后变为(++a)*(++a) +(++a)/2先加加的意思是在整条语句中到分号前最优先执行自增运算,故a + 1 + 1 + 1 = 55 * 5 + 5 / 2 = 25 + 2 = 27*/a = 2;int test2 = COMPUTE_XX(a++); cout<<test2<<endl;  //test2的值为5/*分析:完整替换后变为(a++)*(a++) +(a++)/2C标准并未规定编译器在一个表达式中何时进行自增运算,故结果可能是先把a取出,最后进行3次自增,即2*2+2/2=5;也可能是先取出第一个a,自增后取出第二个a,即2*3+4/2=8。在我的电脑上运行的结果是5,因此采用的是第一种编译方式*/system("pause");return 0;}

原创粉丝点击