对于如下代码,你觉得输出是多少?
#include<cstdio>
using namespace std;
using UL=unsigned long;
int main()
{
register UL cnt(0);
printf("%lu %lu %lu",++cnt,++cnt,++cnt);
return 0;
}
你可能以为是1 2 3
,但实际上是3 3 3
。
我想这是因为++cnt
返回的是引用值,所以放入堆栈里的值也是“引用”值,所以输出的三个数都是三次自增运算后的cnt
。
再来看看这份代码:
#include<cstdio>
#define f_inline inline __attribute__((always_inline))
using namespace std;
using UL=unsigned long;
f_inline func()
{
static UL x(0);
return ++x;
}
int main()
{
register UL x(0);
++(++x),
printf("%lu %lu %lu",func(),func(),func());
return 0;
}
输出是什么?你可能以为是1 2 3
,但实际上是3 2 1
。因为函数传参时会将参数从后往前放入堆栈空间(原因是堆栈是先进后出的结构),所以后面的函数先执行!
所以:
函数参数谨慎用函数!
函数参数慎用自增和自减运算!