函数参数进栈以及自增运算在函数调用中的trick

之前看到个题目

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值