8

次の例を実行すると、出力 0,2,1 が得られます

class ZiggyTest2{

        static int f1(int i) {  
            System.out.print(i + ",");  
            return 0;  
        } 

        public static void main(String[] args) {  
            int i = 0;  
            int j = 0;  
            j = i++;   //After this statement j=0 i=1
            j = j + f1(j);  //After this statement j=0 i=1
            i = i++ + f1(i);  //i++ means i is now 2. The call f1(2) prints 2 but returns 0 so i=2 and j=0
            System.out.println(i);  //prints 2?
        } 
    } 

出力が 0,2,1 ではなく 0,2,2 である理由がわかりません

4

7 に答える 7

5

ステートメントを展開するi = i++ + f1(i)と、次のようになります。

save the value of i in a temp variable, say temp1 // temp1 is 1
increment i by one (i++)                          // i gets the value 2
execute f1(i), save return value in, say temp2    // temp2 is 0, print 2
assign temp1 + temp2 to i                         // i becomes 1 again

主な手順は上記のようにまとめることができると思います。

于 2011-12-23T11:59:30.457 に答える
3
 i = i++ + f1(i);  

i++i2です。呼び出しはf1(i)出力されますが、0を2返すのでi=2j=0

この前に、呼び出されて0に置き換えられたとi = 1想像してくださいf1()

それで

i = i++ + 0;

今では

i = 1 + 0 // then it will increment i to 2 and then (1 +0) would be assigned back to `i`

より簡単な言葉で(ここから@ Piotr)

「i=i++」は大まかに次のように解釈されます

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

別のそのような例:

于 2011-12-23T11:58:18.900 に答える
1

この例から解決策を理解できます

public static void main(String[] args) {
    int i = 0;
    i = i++;
    System.out.println("i is" + i);
}
/* The output is "i is 0" */

したがって、この行から、

i = i++ + f1(i); 

あなたのiはまだ1であり、明らかに関数は0を返します。これは再びiに格納されるため、値1になります。iの更新された値がiに格納される代わりに、代入演算子によってオーバーライドされます。

于 2011-12-23T11:58:12.027 に答える
1

詳細を取得するには、式とその評価順序を確認する必要があります

式i++ + f1(i)の評価について少し説明します

方程式コンパイラでは、 1に等しい"i"を取得し、それを最初のオペランドとしてスタックに置き、次に"i"をインクリメントします。したがって、その値は2になり、 0になる関数を呼び出して操作時に2 番目のオペランドを計算します。 (+)実行オペランドは1および0になります。

于 2011-12-23T12:44:48.470 に答える
1

プリインクリメントとは、変数に 1 を加算し、インクリメントされた値を返すことを意味します。ポストインクリメント - 最初に i を返し、次にそれをインクリメントします。

int i, j, k;
i = 0; // 0
j = i++; // return i , then increment i
// j = 0; i = 1;
k = ++i; // first increment and return i
//k = 2; i = 2;

// now
++j == --k == --i // would be true => 1==1==1;
// but , using post increment would 
// j++ == k-- == i-- // false because => 0 == 2 == 2;
// but after that statement j will be 1, k = 1, i = 1;
于 2011-12-23T12:09:52.380 に答える
1

この説明が役立つことを願っています:

j = i++; // Here since i is post incremented, so first i being 0 is assigned to j
         // and after that assignment , i is incremented by 1 so i = 1 and j = 0.

i = i++ + f1(i); // here again since i is post incremented, it means, the initial value 
                 // of i i.e. 1 as in step shown above is used first to solve the 
                 // expression i = i(which is 1) + f1(1)**Since i is 1**
                 // after this step the value of i is incremented. so i now becomes 2
                 // which gets displayed in your last System.out.println(i) statement.   

これを試してみてください

i = ++i + f1(i); // here i will be first inremented and then that value will be used 
                 // to solve the expression i = i + f1(i)'

つまり、ポストインクリメント中に、式が最初に解決され、次に値がインクリメントされます。しかし、プリインクリメントでは、値が最初にインクリメントされ、次に式が解決されます。

しかし、あなただけを書くなら

i++;
++i;

それから、どちらも同じことを意味します。

よろしく

于 2011-12-23T12:11:27.617 に答える
1

ポスト インクリメント オペレータでは、使用後にオペランドの値が増加します。

int k =1;
        int l = k++;
        System.out.println("...k..."+k+"...l.."+l);

最初の k (値 = 1) に l が割り当てられ、その後 k の値が増加します

同様のことが次の行で起こります

i = i++ + f1(i);
于 2011-12-23T12:11:47.357 に答える