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

受此启发,我开始思考以下Java代码的良好定义:

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有相反的设计选择。