回答
不,没有这样的保证。根据C++标准它是未定义的。
Bjarne的Stroustrup的也表示明确地在“The C++程序设计语言”第3版第6.2.2节,具有一定的推理:
更好的代码可以在 没有限制的情况下产生对表达 评价顺序
虽然技术上这指的是相同的部分,其说,表达的零件的评估顺序也是未定义的早期部分,即
int x = f(2) + g(3); // udefined whether f() or g() is called first
bar()和baz()没有指定的顺序 - 标准说的唯一的事情就是它们都将在foo()被调用之前被评估。根据C++标准,5.2.2/8节:
参数 的评估顺序未指定。
至少在foo()之前对它们进行评估的事实有点让人放心。 – 2017-04-25 13:58:01
从[5.2.2]功能呼叫,
的参数评价的顺序是不确定的。参数表达式评估的所有副作用在输入函数之前生效。
因此,不能保证bar()
将baz()
之前运行,只有bar()
和baz()
将foo
之前被调用。
另外,从[5]表达式注意:
除非另有说明[例如特殊规则
&&
和||
],个别操作符和个别表达式的子表达式的操作数的评估顺序,以及发生副作用的顺序是未指定的。
所以即使你在问是否bar()
将在foo(bar() + baz())
baz()
之前运行,订单仍然是不确定的。
[5.14]逻辑AND运算符中的“特别提示”示例:“不像'&','&&'保证从左至右的评估:如果第一个操作数为”false“,则不评估第二个操作数。 – 2010-05-29 12:31:10
在C++ 11,相关的文本可以在8.3.6 Default arguments/9(重点煤矿)中找到每一个函数被调用时
默认参数进行评估。 函数参数的求值顺序未指定。因此,函数的参数不应该用在默认参数中,即使它们没有被评估。
C++ 14标准也使用了相同的措辞,并在the same section下找到。
C++ 17指定直到C++ 17为止未指定的运算符的评估顺序。请参阅问题What are the evaluation order guarantees introduced by C++17?但请注意您的表达
foo(bar(), baz())
仍未指定评估顺序。
正如其他人已经指出的那样,该标准没有给出关于这个特定场景评估顺序的任何指导。评估顺序留给编译器,编译器可能有保证。
请务必记住,C++标准实际上是一种指示编译器构造汇编/机器代码的语言。该标准只是等式的一部分。如果标准不明确或者具体定义了实现,则应该转向编译器并了解它如何将C++指令转换为真正的机器语言。因此,如果评估的顺序是一个需求,或者至少是重要的,并且交叉编译器兼容并不是必需的,那么请调查编译器如何最终将它们组合在一起,您的答案可能最终会落在那里。请注意,编译器可能会改变它的方法在未来
- 1. C评价秩序
- 2. C++参数评价顺序
- 3. 秩序的功能应用
- 4. 功能评价超时
- 5. 功能评价禁用的,因为以前的功能评价超时
- 6. 秩序的IList与参数
- 7. C++ 17评价顺序与运算符重载功能
- 8. C/C++宏评价顺序
- 9. 移动语义&参数评价顺序
- 10. 更新与价值功能似乎只评价函数一次
- 11. JavaScript是否具有功能参数评估的定义顺序?
- 12. 评价或制作功能javascript
- 13. Obj-C功能参数
- 14. C++酒吧功能参数
- 15. C:信号功能(参数?)
- 16. C#通功能参数
- 17. 评价在C++
- 18. 评价在C#
- 19. ASP Filter功能 - > C#等价函数
- 20. R中未评价的参数
- 21. 密集秩价格
- 22. 秩序的NSArray - 目标C
- 23. JavaScript性能评价
- 24. 迭代器在置换价值秩序
- 25. “太多的参数功能”用C
- 26. 功能C++的参数太少
- 27. 功能错误的参数太少? (C++)
- 28. 出错的C#语法功能参数
- 29. C++代码的功能参数
- 30. C#中VB6的ObjPtr的等价(功能)?
我可以在8分钟内接受这个答案... 我想我坚持了一下! – 2010-05-29 12:02:39
是的,但如果表达式评估顺序为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
如果订购很重要,您可以自由地进行排序。否则总是会导致花费一些并不总是(很少?)重要的事情。我认为不支付你不使用的政策是大多数C++程序员认同的唯一方法。 – tweej 2017-12-02 09:53:54