fun(int a ,int b)
{
int c;
c=a+b;
return c;
}
main()
{
int x=6,r;
r=func(x,x+=2);
printf("%d\n",r);
}
结果是16先求了右边的参数,为什么不是x=6带进去,第二个x+2=8带进去呢?求大神指点
...全文
25719打赏收藏
参数执行顺序问题
#include fun(int a ,int b) { int c; c=a+b; return c; } main() { int x=6,r; r=func(x,x+=2); printf("%d\n",r); } 结果是16先求了右边的参数,为什么不是x=6带进去,第二个x+2=8带进去呢?求大神指点
压栈顺序和求值顺序并没有什么关系,我完全可以先从左往右求值,(然后存下求得的值),再从右往左压栈。[/quote]
对于楼主的这个函数参数是有关系的,从右向左压栈就是func(8,8),从左向右就是func(6,8)[/quote]
你指的是求值顺序,和压栈顺序没有关系。
见:calling convention and evaluation order
这就是个表达式顺序点的问题,和栈有什么关系?
gcc现在都会检查这种问题并且警告 warning: unsequenced modification
fastcall调用方式甚至都不一定用到栈,编译器完全可以从左到右计算参数,然而这样写依然是未定义行为。[/quote]
虽然是表达式,但是参数传递,传递的是值,那么它需要将计算结果传过去。我看fastcall的参数从左到右传递也不是所有参数,是有条件的
http://blog.csdn.net/shenwansangz/article/details/50965415[/quote]
我不是要说fastcall是从左到右,我是说标准并没有规定函数参数的计算顺序,任何人完全可以写一个编译器是按照随机顺序入栈而依然符合语言标准。宣传从右到左或者从左到右都有点误导别人的成分。
https://timsong-cpp.github.io/cppwp/n3337/expr.call#8
N3337说:
The evaluations of the postfix expression and of the argument expressions are all unsequenced relative to one another.[/quote]
我感觉这样做没有实在意义,不按照编译器的执行。
这就是个表达式顺序点的问题,和栈有什么关系?
gcc现在都会检查这种问题并且警告 warning: unsequenced modification
fastcall调用方式甚至都不一定用到栈,编译器完全可以从左到右计算参数,然而这样写依然是未定义行为。[/quote]
虽然是表达式,但是参数传递,传递的是值,那么它需要将计算结果传过去。我看fastcall的参数从左到右传递也不是所有参数,是有条件的
http://blog.csdn.net/shenwansangz/article/details/50965415[/quote]
我不是要说fastcall是从左到右,我是说标准并没有规定函数参数的计算顺序,任何人完全可以写一个编译器是按照随机顺序入栈而依然符合语言标准。宣传从右到左或者从左到右都有点误导别人的成分。
https://timsong-cpp.github.io/cppwp/n3337/expr.call#8
N3337说:
The evaluations of the postfix expression and of the argument expressions are all unsequenced relative to one another.