为了账号安全,请及时绑定邮箱和手机立即绑定

关于实参表计算方向的问题

关于实参表计算方向的问题

C++
谢偃 2016-12-27 11:08:00
我听别人说实参表计算方向自右向左,即 int fun(int a,int b) {……} 调用fun fun (i,++i) 如果i=2, 因实参表自右向左计算,先++i,再i 即a=3,b=3 对吗?
查看完整描述

3 回答

已采纳
?
onemoo

TA贡献883条经验 获得超454个赞

不对。

C++标准没有规定参数的求值顺序,也就是这是所谓的“未定义行为”,不要写依赖这种行为的代码。

不仅是函数参数,其实很多运算符的操作数也没有规定求值顺序,所以一般对于写复合表达式有一个建议:如果表达式改变了一个操作数的值,那就不要在这个复合表达式中再次使用这个操作数。除非你能确定“改变值”和“读取值”的先后顺序

尤其是对于自增/自减这种有副作用的表达式来说,在你不确定时顺序时,不要多次使用其操作数的值。


如果你曾听说过关于参数的什么“顺序”的话,那可能是这个:函数参数传参/压栈顺序是有相应规定的,这包含在“调用约定”中。实际上有多种调用约定,有的规定从右向左压栈、有的是从左向右压栈...   绝大多数使用的cdecl约定是从右向左压栈。 这和参数的求值顺序完全没有关系。另外如果你还不知道“压栈”是什么东西的话,就别管这个了。

查看完整回答
反对 回复 2016-12-27
?
angie

TA贡献56条经验 获得超8个赞

不知道你有没有实际运行代码试一下

对于 fun(i, ++i) 这种写法是一种未定义的行为(C标准未定义),编译器厂商可以根据自己的理解进行定义这种行为(比如使用 clang 就会警告你 unsequenced modification and access to i)。因此这是不推荐的写法,因为使用不用的编译器可能产生不同的结果。

对于实参表,确实是从右往左的,因为函数调用会有一个入栈的过程。但对于 a == 3 和 b == 3这个结果,不一定是正确的

查看完整回答
反对 回复 2016-12-27
  • 3 回答
  • 1 关注
  • 1470 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信