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