C语言参数列表参数的存储与压入栈帧的顺序

https://mp.weixin.qq.com/s/AEuzI-OpWj9hmQCN6pCB9A

转载自微信公众号【编程珠玑】

#include <stdio.h>
int main(void)
{
    int i = 4;
    printf("%d\n%d\n%d\n%d\n",i,i+1,i++,i);
    return 0;
}

乍一看不就是输出

4

5

4

5

么,但在有的环境(我这里macOS10.15.6+clang 12.0.0,会提示警告,但还是会输出上面结果)是会输出

5

6

4

5

这是因为,通常来说(不是绝对),参数是按照从右往左顺序计算,然后压入栈帧,也就是说,对iostream类"可调用"实例对象cout而言,传参是从右到左的:

i  ,该位置参数值为i的值
i++,后置自增,先用再增,即得到4,该位置参数值为4,而i变为5
i+1,此时值为5+1=6,得到6,该位置参数值为6,i的值本身不变,即还是5
i,该位置参数值为i的值,即5。

因此,参数i的地方都为5,其他两个位置分别为6和4。

注意,这里i的值最终变为了5。

因此,从左到有,输出的值分别为5,6,4,5

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值