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

C+中的编译器和求值的参数顺序

C+中的编译器和求值的参数顺序

C++
九州编程 2019-07-02 17:37:38
C+中的编译器和求值的参数顺序好的,我知道标准规定C+实现可以选择计算函数的参数的顺序,但是在实际会影响程序的场景中,是否有任何实现可以“利用”这一点呢?典型例子:int i = 0;foo(i++, i++);注意:我不是在找人告诉我,评估的顺序是不能依赖的,我很清楚这一点。我只感兴趣的是,是否有任何编译器确实按照从左到右的顺序进行计算,因为我的猜测是,如果他们做了大量编写不当的代码,就会崩溃(这是正确的,但他们可能仍会抱怨)。
查看完整描述

3 回答

?
梦里花落0921

TA贡献1772条经验 获得超6个赞

它取决于参数类型、被调用函数的调用约定、结构和编译器。在x86上,帕斯卡调用约定计算从左到右的参数,而在C调用约定中(_cdecl从右到左。大多数在多个平台上运行的程序都会考虑调用约定来跳过意外事件。

有一个很好的文章如果你有兴趣的话,可以在雷蒙德·陈的博客上。您可能还想看看堆栈和调用GCC手册一节。

编辑:只要我们分道扬镳:我的回答不是把这看作一个语言问题,而是一个平台问题。该语言标准不支持或倾向于其中一种而不是另一种,而将其保留为未指定..注意措辞。它并没有说这是没有定义的。在这个意义上不明确意味着一些你不能指望的,不可移植的行为。我手头没有C规范/草案,但它应该与我的n 2798草案(C+)相似

抽象机器的某些其他方面和操作在本国际标准中被描述为未指定(例如,函数的参数计算顺序)。在可能的情况下,本国际标准定义了一组允许的行为。这些定义了抽象机器的非确定性方面。因此,对于给定程序和给定输入,抽象机器的实例可以具有多个可能的执行序列。


查看完整回答
反对 回复 2019-07-02
?
蓝山帝景

TA贡献1843条经验 获得超7个赞

我找到了答案C+标准.

第5.2.2.8段:

参数的计算顺序未指定。参数表达式计算的所有副作用在输入函数之前生效。未指定后缀表达式和参数表达式列表的计算顺序。

换句话说,它只依赖于编译器。


查看完整回答
反对 回复 2019-07-02
?
慕少森

TA贡献2019条经验 获得超9个赞

读这个

这不是你的问题的确切副本,但我的回答(和其他几个)也涵盖了你的问题。

有很好的优化理由,为什么编译器可能不只是选择从右到左,但也交织它们。

标准甚至不能保证顺序排序。它确保在调用该函数时,所有参数都已完全评估。

是的,我见过一些版本的GCC就是这样做的。对于您的示例,foo(0,0)将被调用,之后我将被调用2。(我不能给出编译器的确切版本号。那是一段时间以前的事了-但我不会惊讶地看到这种行为再次出现。这是安排指令的有效方法)


查看完整回答
反对 回复 2019-07-02
  • 3 回答
  • 0 关注
  • 437 浏览

添加回答

举报

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