int i = 10, j = 5, k;
k = f(++i) + g(++i) + j+ 25;
f(++i)
またはg(++i)
が最初に計算されますか?最初にどのメソッドコンパイラが実行されますか?
どのようにプログラムを実行しないで知ることができますか?
f
と仮定すると、順序変更は、コンパイラに依存しない方法g
は
int f(int a)
{ return a; }
に似ていますか?
int i = 10, j = 5, k;
k = f(++i) + g(++i) + j+ 25;
f(++i)
またはg(++i)
が最初に計算されますか?最初にどのメソッドコンパイラが実行されますか?
どのようにプログラムを実行しないで知ることができますか?
f
と仮定すると、順序変更は、コンパイラに依存しない方法g
は
int f(int a)
{ return a; }
に似ていますか?
どのメソッドコンパイラがfistを実行しますか?
命令を実行するのはコンパイラではなく、JVMです。
そして、Javaプログラミング言語は、演算子のオペランドがJVMによって左から右に評価されることを保証します。 JLS Sec 15.7:
Javaプログラミング言語は、演算子のオペランドが特定の評価順、つまり左から右に評価されているように見えることを保証します。
コンパイルされたクラスの同等の式の順序をコンパイラが再編成できるかどうかについては、「最適化」の理由が考えられます。これらは、あるJavaバージョンから別のJavaバージョンに変更される可能性があります。したがって、一般的には考慮しないでください。
コンパイラが命令を実行しないのは当然ですが、評価の順序を決めるのはコンパイラです(標準で評価の順序が決まりますが、標準のその部分を実装するのはコンパイラです)。JVMではなく。 JVMは、コンパイラが生成した順序(上から下へ)で命令を実行します。 JVMレベルには左右がありません。 – sepp2k
別段の変更がない限り、評価は左から右です。したがって、この場合、f(++ i)が最初になります。
EDIT:@sanAが指摘しているように、コンパイラの最適化が可能です。あなたのケースでは、あなたの関数がおそらく副作用として認定されている可能性は低いですが、不可能ではありません。
あなたはそれを実行しようとしましたか?またはプログラムをデバッグしようとしますか? – anacron
これを読みなさい http://stackoverflow.com/questions/9081393/is-the-left-to-right-order-of-operations-guaranteed-in-java –
@ sanAのリンクは読むのに非常によいものです。私の答えはあなたのケースに当てはまりますが、他の人には当てはまらないかもしれません。 – Malachi