11

ちょっとした Java パズルを作りたかったのですが、戸惑いました。パズルの一部は次のとおりです。

次のコードは何をしますか:

public class test {
    public static void main(String[] args) {
        int i = 1;
        i += ++i + i++ + ++i;

        System.out.println("i = " + i);
    }
}

を出力します9

私の(少なくとも部分的に)間違った説明

よくわかりませんが、後の項は次のi +=ように評価されると思います。

ここに画像の説明を入力

そう

int i = 1;
i += ++i + i++ + ++i;

と同じです

int i = 1;
i += ((++i) + (i++)) + (++i);

これは左から右に評価されます (事前および事後増分 Java 評価を参照)。

最初は に++iインクリメントiして2を返します2。だからあなたは持っています:

i = 2;
i += (2 + (i++)) + (++i);

はの新しい値であるため、 をi++返し、次のようにインクリメントします。2ii3

i = 3;
i += (2 + 2) + ++i;

2 番目は に++iインクリメントiし、次の値を4返します4

i = 4;
i += (2 + 2) + 4;

したがって12、 ではなく になり9ます。

私の説明のどこに誤りがありますか? 正しい説明は何でしょう?

4

6 に答える 6

10

i += ++i + i++ + ++i;と同じですi = i + ++i + i++ + ++i;

右辺は、左から右に降伏して計算されi = 1 + 2 + 2 + 4;ます (つまり、 が得られますi = 9)。

于 2012-07-11T11:51:31.050 に答える
1

Java がどのように値をレジスターに格納するかを想像すれば、その仕組みを理解するのは非常に簡単です! 彼は最初のレジスタに 1 を入れ、= 記号を通過し、i(++i) をインクリメントします。したがって、i には 2 があり、2 番目のレジスタには 2 がありますが、最初のレジスタは更新されません。 3 番目のレジスターでは 2 になり、次に i がインクリメントされ、次に i がインクリメントされ、最後のレジスターでは 4 になります。したがって、次のようなものになります 1 = 2 + 2 + 4 == 9

于 2012-07-11T11:55:31.273 に答える
1

コード

int i = 1;
i += ++i + i++ + ++i

と同等です

int tmp1 = i // 1, +=

i ++; // 2
int tmp2 = i; // 2

int tmp3 = i; // 2
i ++; // 3

i ++; // 4
int tmp4 = i; // 4

i = tmp1 + tmp2 + tmp3 + tmp4; // 9
于 2012-07-11T12:01:47.240 に答える
0

i += ++i + i++ + ++i;

  1. i=1開始時
  2. i += X-> i = i + X -> i = 1 + X (X を数えましょう)
  3. ++i2 にインクリメントされ、return 2
  4. i++return 2その後、3 にインクリメントされます
  5. ++i3 から 4 に増加し、return 4
  6. X = 2 + 2 + 4 = 8

だからi = 1 + 8- >i=9


コードが次のようなものである場合、12が得られます

int i = 1;
int tmp = ++i + i++ + ++i;  
i += tmp;

あなたのコードi=1i=4i+=tmpi=4+8=12

于 2012-07-11T12:03:44.620 に答える