写了如下的c语言代码:
#include<stdio.h>
void f(int a,int b,int c)
{
printf("%d %d %d",a,b,c);
}
int main()
{
int x=0;
f(x=1,x=2,x=3);
return 0;
}
运行后输出 1 1 1。我知道传参时进栈顺序是从右至左。但是,为什么后两个参数明明已经算出结果了,却还是被x=1覆盖,是不是算出结果3和2后没有直接进栈?对这其中的细节有疑问,希望各位不吝赐教,谢谢!
压入堆栈的顺序和表达式求值的顺序没有关系。编译器既可以先算x=3,也可以先算x=1
像你这种表达式有副作用(表达式求值会改变表达式自身)的,C语言也没有规定编译器怎么处理。
对于C语言,函数参数求值顺序是编译器未定义行为
,不同编译器都可能不一样。
进一步阅读:https://blog.csdn.net/mimahoo/article/details/51148578
说一下我的理解吧,不一定对;
因为你f函数里有运算,所以函数执行前会先执行里面的赋值运算,正常来说运算顺序是从右向左,所以f(x = 1, x = 2, x = 3)执行顺序为
x = 3;
x = 2;
x = 1;
f(x, x, x);
这样传的是3个1,输出当然是3个1;
函数传参过程中,最右边的对应栈顶,所以这里x取栈底的值,即x最后取1.据我了解这和编译期间的代码优化有关,感兴趣可以参考相关书籍。