#define prod(a) (a*a)
using namespace std;
int main()
{
int i = 3, j, k, l;
j = prod(i++);
cout << i << endl;
k = prod(++i);
cout << i << endl;
l = prod(i+1);
cout << i << " " << j << " " << k << " " << l;
}
为什么变量“i
”会递增两次?
,即j=prod(i++);
答案 0 :(得分:2)
请记住,源代码中的宏已扩展,而不是实际调用或评估。
这意味着像“
”这样的“召唤”prod(i++)
导致扩展代码
i++*i++
被编译器看到。
许多编译器允许您在预处理之后停止,或以其他方式生成预处理源,您可以检查它们以查看宏扩展。
如果你继续使用这样的宏和其他表达式作为参数,你很快就会看到他们不好的另一个原因。
让我们说你用
prod(2+4)
然后这将导致扩展
2+4*2+4
等于
2+(4*2)+4
等于14,而不是可能预期的36。
答案 1 :(得分:1)
为什么变量&#34;我&#34;递增两次?即在j = prod(i ++)
之后从3到3
因为prod()
是宏,而不是函数,所以
k=prod(++i);
成为
k=(++i * ++i);