2010-05-29 66 views

回答

83

不,没有这样的保证。根据C++标准它是未定义的。

Bjarne的Stroustrup的也表示明确地在“The C++程序设计语言”第3版第6.2.2节,具有一定的推理:

更好的代码可以在 没有限制的情况下产生对表达 评价顺序

虽然技术上这指的是相同的部分,其说,表达的零件的评估顺序也是未定义的早期部分,即

int x = f(2) + g(3); // udefined whether f() or g() is called first 
+0

我可以在8分钟内接受这个答案... 我想我坚持了一下! – 2010-05-29 12:02:39

+0

是的,但如果表达式评估顺序为STRICT,那么更好的代码可以是WRITTEN(=更清晰),这通常比代码生成更重要。看到这个例子:http://stackoverflow.com/questions/43612592/the-case-where-c-ab-is-not-equal-to-c-ab-b-b1?noredirect=1#comment74274141_43612592 所以那里,Stroustrup。 – 2017-04-25 13:57:06

+1

如果订购很重要,您可以自由地进行排序。否则总是会导致花费一些并不总是(很少?)重要的事情。我认为不支付你不使用的政策是大多数C++程序员认同的唯一方法。 – tweej 2017-12-02 09:53:54

18

bar()和baz()没有指定的顺序 - 标准说的唯一的事情就是它们都将在foo()被调用之前被评估。根据C++标准,5.2.2/8节:

参数 的评估顺序未指定。

+2

至少在foo()之前对它们进行评估的事实有点让人放心。 – 2017-04-25 13:58:01

13

从[5.2.2]功能呼叫,

的参数评价的顺序是不确定的。参数表达式评估的所有副作用在输入函数之前生效。

因此,不能保证bar()baz()之前运行,只有bar()baz()foo之前被调用。

另外,从[5]表达式注意:

除非另有说明[例如特殊规则&&||],个别操作符和个别表达式的子表达式的操作数的评估顺序,以及发生副作用的顺序是未指定的。

所以即使你在问是否bar()将在foo(bar() + baz())baz()之前运行,订单仍然是不确定的。

+3

[5.14]逻辑AND运算符中的“特别提示”示例:“不像'&','&&'保证从左至右的评估:如果第一个操作数为”false“,则不评估第二个操作数。 – 2010-05-29 12:31:10

2

在C++ 11,相关的文本可以在8.3.6 Default arguments/9(重点煤矿)中找到每一个函数被调用时

默认参数进行评估。 函数参数的求值顺序未指定。因此,函数的参数不应该用在默认参数中,即使它们没有被评估。

C++ 14标准也使用了相同的措辞,并在the same section下找到。

0

正如其他人已经指出的那样,该标准没有给出关于这个特定场景评估顺序的任何指导。评估顺序留给编译器,编译器可能有保证。

请务必记住,C++标准实际上是一种指示编译器构造汇编/机器代码的语言。该标准只是等式的一部分。如果标准不明确或者具体定义了实现,则应该转向编译器并了解它如何将C++指令转换为真正的机器语言。因此,如果评估的顺序是一个需求,或者至少是重要的,并且交叉编译器兼容并不是必需的,那么请调查编译器如何最终将它们组合在一起,您的答案可能最终会落在那里。请注意,编译器可能会改变它的方法在未来