Java中点算子求值的顺序
受此启发,我开始思考以下Java代码的良好定义:Java中点算子求值的顺序,java,evaluation,Java,Evaluation,受此启发,我开始思考以下Java代码的良好定义: public class Test { List<Object> foo; Object bar() { foo = new ArrayList<Object>(): return(/* Anything */); } void frob() { foo.add(bar()); } } 公共类测试{ 罗列富; 对象栏(){ foo
public class Test {
List<Object> foo;
Object bar() {
foo = new ArrayList<Object>():
return(/* Anything */);
}
void frob() {
foo.add(bar());
}
}
公共类测试{
罗列富;
对象栏(){
foo=新的ArrayList():
返回(/*任何内容*/);
}
无效frob(){
foo.add(bar());
}
}
在这种情况下,Java规范是否为frob
中的点运算符指定了严格的求值顺序?是否保证从左到右的求值,以便始终在bar
用新列表替换字段之前的列表上执行add
方法,或者是否有合法的编译器允许bar
在foo
字段被取入frob
之前执行,因此在新列表上执行add
方法
我怀疑从左到右的评估是有保证的,但是规范中有这样的措辞吗?是的,这是
如果窗体是主窗体。涉及[TypeArguments]标识符
,然后:
- 如果调用模式是静态的,则没有目标引用。对主表达式求值,但随后返回结果
丢弃
- 否则,将计算
主表达式,并将结果用作目标引用。
然后是
C和C++的OpthOpthes,它们是实现定义的或未定义的,因此实现可以为它们的环境使用最高效的。他们牺牲便携性来换取性能。Java有相反的设计选择。