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

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

好的,我知道标准规定C+实现可以选择计算函数的参数的顺序,但是在实际会影响程序的场景中,是否有任何实现可以“利用”这一点呢?

典型例子:

int i = 0;foo(i++, i++);

注意:我不是在找人告诉我,评估的顺序是不能依赖的,我很清楚这一点。我只感兴趣的是,是否有任何编译器确实按照从左到右的顺序进行计算,因为我的猜测是,如果他们做了大量编写不当的代码,就会崩溃(这是正确的,但他们可能仍会抱怨)。


九州编程
浏览 438回答 3
3回答

梦里花落0921

它取决于参数类型、被调用函数的调用约定、结构和编译器。在x86上,帕斯卡调用约定计算从左到右的参数,而在C调用约定中(_cdecl从右到左。大多数在多个平台上运行的程序都会考虑调用约定来跳过意外事件。有一个很好的文章如果你有兴趣的话,可以在雷蒙德·陈的博客上。您可能还想看看堆栈和调用GCC手册一节。编辑:只要我们分道扬镳:我的回答不是把这看作一个语言问题,而是一个平台问题。该语言标准不支持或倾向于其中一种而不是另一种,而将其保留为未指定..注意措辞。它并没有说这是没有定义的。在这个意义上不明确意味着一些你不能指望的,不可移植的行为。我手头没有C规范/草案,但它应该与我的n 2798草案(C+)相似抽象机器的某些其他方面和操作在本国际标准中被描述为未指定(例如,函数的参数计算顺序)。在可能的情况下,本国际标准定义了一组允许的行为。这些定义了抽象机器的非确定性方面。因此,对于给定程序和给定输入,抽象机器的实例可以具有多个可能的执行序列。

蓝山帝景

我找到了答案C+标准.第5.2.2.8段:参数的计算顺序未指定。参数表达式计算的所有副作用在输入函数之前生效。未指定后缀表达式和参数表达式列表的计算顺序。换句话说,它只依赖于编译器。

慕少森

读这个这不是你的问题的确切副本,但我的回答(和其他几个)也涵盖了你的问题。有很好的优化理由,为什么编译器可能不只是选择从右到左,但也交织它们。标准甚至不能保证顺序排序。它只确保在调用该函数时,所有参数都已完全评估。是的,我见过一些版本的GCC就是这样做的。对于您的示例,foo(0,0)将被调用,之后我将被调用2。(我不能给出编译器的确切版本号。那是一段时间以前的事了-但我不会惊讶地看到这种行为再次出现。这是安排指令的有效方法)
打开App,查看更多内容
随时随地看视频慕课网APP