众所周知,c 和 c++ 中的参数评估顺序没有定义:例如:foo(a(),b())
在上面的调用中,由编译器的实现来决定选择哪个评估顺序,从而决定首先执行哪个函数。最近我的一位朋友问为什么在 C 或 C++ 中未指定评估顺序。当我用谷歌搜索它时,我开始知道指定评估顺序会导致代码生成不理想。但怎么会这样呢?为什么定义的参数评估顺序会导致次优代码?当我提到 Java 的参数评估顺序时。我在规范中找到了以下内容。
15.7.4. 参数列表从左到右求值
在方法或构造函数调用或类实例创建表达式中,参数表达式可能出现在括号内,用逗号分隔。每个参数表达式似乎在其右侧的任何参数表达式的任何部分之前都已被完全评估。如果参数表达式的求值突然完成,其右侧的任何参数表达式的任何部分似乎都没有被求值?
在这种情况下,Java 有一个定义的参数评估顺序,但是如果指定了这样的行为,说 C 或 C++ 编译器会产生次优代码似乎有点奇怪。你能对此有所了解吗?