#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 = 5
5 * 5 + 5 / 2 = 25 + 2 = 27
*/
a = 2;
int test2 = COMPUTE_XX(a++);
cout<<test2<<endl; //test2的值为5
/*分析:
完整替换后变为(a++)*(a++) +(a++)/2
C标准并未规定编译器在一个表达式中何时进行自增运算,故结果可能是先把a取出,最后进行3次自增,即2*2+2/2=5;
也可能是先取出第一个a,自增后取出第二个a,即2*3+4/2=8。在我的电脑上运行的结果是5,因此采用的是第一种编译方式
*/
system("pause");
return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)