之前看到个题目
int k = 1;
printf("%d,%d\n",k,k++);
答案显而易见是2 1,
因为函数调用时,参数的进栈顺序是从右向左,所以是先将k++进栈,即此时第二个参数值是1,但是k已经自增为2
int k = 1;
printf("%d,%d\n",++k,++k);
我预期的结果是3 2
但是结果是3 3
我有点奇怪
我再去试试
int k = 1;
printf("%d,%d\n",k++,k++);
预期的结果是2 1,没有问题
那么上面前自增操作符为什么输出的结果是3 3?
我去查看了C++里面的前自增操作符和后自增操作符
果然有两句highlight起来的话:
1.为了与内置类型一致,前缀式操作符应返回被增量或减量对象的引用
2.为了与内置类型一直,后缀式操作符应返回旧值(即,尚未自增或自减的值),并且,应作为值返回,而不是返回应用。
那么一切就都解决了
int k = 1;
printf("%d,%d\n",++k,++k);
这段代码,被作为参数压到栈里面的是引用,因而两个自增执行完后,两个参数的值都是对应k的引用,即3
因而输出是3 3