9

このWebサイトでこの問題に遭遇し、Eclipseで試しましたが、それらがどのように評価されているか正確に理解できませんでした。

    int x = 3, y = 7, z = 4;

    x += x++ * x++ * x++;  // gives x = 63
    System.out.println(x);

    y = y * y++;
    System.out.println(y); // gives y = 49

    z = z++ + z;
    System.out.println(z);  // gives z = 9

ウェブサイトのコメントによると、 x += x++ * x++ * x++ は x = x+((x+2)*(x+1)*x) に解決され、これは真であることが判明しました。この演算子の優先順位について何かが欠けていると思います。

4

6 に答える 6

13

Java は、式をその優先順位に従って左から右に評価します。

int x = 3, y = 7, z = 4;

x (3) += x++ (3) * x++ (4) * x++ (5);  // gives x = 63
System.out.println(x);

y = y (7) * y++ (7);
System.out.println(y); // gives y = 49

z = z++ (4) + z (5);
System.out.println(z);  // gives z = 9

後置インクリメント演算子は、変数が使用/返された後にのみ変数をインクリメントします。すべてが正しいようです。

これは、後置インクリメント演算子の擬似コードです。

int x = 5;
int temp = x;
x += 1;
return temp;

JLS 15.14.2 から (参照):

後置インクリメント式の値は、新しい値が格納される前の変数の値です。

于 2012-11-13T21:53:00.487 に答える
5

演算子の優先順位自体とは関係なく、評価の順序のみです。ここで知っておくべき 2 つのこと:

  1. x++は後置インクリメントなので、 の値は評価xにインクリメントされます
  2. *右側を評価してから左側を評価します。

ポイント2を考慮すると、式x++ * x++ * x++はより具体的に次のように書き換えることができますx++ * (x++ * (x++))

式全体を手続きとして書くことができます:

a = x
x += 1
b = x
x += 1
c = a*b
d = x
x += 1
return c*d
于 2012-11-13T21:56:24.377 に答える
2

変数 x の後にインクリメント操作 ++ が追加されているためです。これはポストインクリメント操作です。つまり、操作が処理された後に x がインクリメントされます。

In your example the expression would be: 
x += 3 * 4 * 5
First the expression is added by 3 (x+=....)
then the first x++ results in 3
the second x++ results in 4 (because it was incremented before)
and the third x++ results in 5.

操作が実行される前に変数をインクリメントしたい場合は、++x (プレインクリメント操作) を記述する必要があります。

于 2012-11-13T22:11:26.887 に答える
2

後置演算子x++は、「今は x の値を与えるが、将来の参照のためにそれをインクリメントする」のようなものを意味します

したがって、操作と評価の順序によって、

x++ * x++ * x++

最初に次のように解釈されます

3 * 4 * 5(=60)

これを元の3 に追加すると、63 になります。

同じ行にあるため、元の値が使用されます。次のように記述した場合:

int x = 3;

int y += x++ * x++ * x++; 
x += y;

xx2 行目の が元の 3 ではなく 6 になったため、63 ではなく 66 になります。

于 2012-11-13T21:54:00.490 に答える
1

ポストインクリメントは、値が取得された後に変数を変更し、+= は右側を評価する前に左側を評価するため、

x += x++ * x++ * x++; 

になる

tmp0 = x

tmp1 = x
++x
tmp2 = tmp1 * x
++x
tmp3 = tmp2 * x
++x

x = tmp0 + x
于 2012-11-13T21:53:08.887 に答える
1

単項演算子は左から右に評価されるため、最初の演算子x++は値 を取得しx、2 番目の演算子は(x+1)などになります。また、+= は最初の の値に従って評価されるxため、x

于 2012-11-13T21:54:55.720 に答える