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

猜你喜欢

转载自blog.csdn.net/HayPinF/article/details/109096281