web-dev-qa-db-ja.com

Java:インクリメント/デクリメント演算子の前置/後置?

以下のプログラムまたは here から、最後にSystem.out.println(i)を呼び出したときに値7

class PrePostDemo {
     public static void main(String[] args){
          int i = 3;
          i++;
          System.out.println(i);    // "4"
          ++i;             
          System.out.println(i);    // "5"
          System.out.println(++i);  // "6"
          System.out.println(i++);  // "6"
          System.out.println(i);    // "7"
     }
}
29
O_O
i = 5;
System.out.println(++i); //6

Iを追加して値を返すため、これは「6」を出力します。 5 + 1 = 6;これはプレフィックスであり、操作で使用する前に番号に追加されます。

i = 6;
System.out.println(i++); //6 (i = 7, prints 6)

これはiを取得し、コピーを保存し、1を追加してコピーを返すため、「6」を出力します。だから、あなたは私がいた値を取得しますが、同時にそれをインクリメントします。したがって、古い値を出力しますが、増分されます。後置インクリメントの美しさ。

次に、iを出力すると、インクリメントされたため、iの実際の値が表示されます。 7

63
Spidy

これは回答済みですが、別の説明が役立つと思います。

それを説明する別の方法は次のとおりです。

++inew iの結果を提供し、i++は元のiの結果を提供し、次のアクションのためにnew iを保存します。

それを考える方法は、表現内で何か他のことをすることです。 iの現在の値を出力する場合、iが式内で変更されたか、式の後に変更されたかによって異なります。

    int i = 1;
result i = ++i * 2 // result = 4, i = 2

iは、結果が計算される前に評価(変更)されます。この式のiを印刷すると、この式に使用されるiの変更された値が表示されます。

result i = i++ * 2 // result = 2, i = 2

iは、計算結果の後に評価されます。したがって、この式からiを出力すると、この式で使用されるiの元の値が得られますが、iは今後の使用のために変更されます。したがって、式の直後にiの値を出力すると、iの新しい増分値が表示されます。 iの値が変更されたため、印刷されるか使用されるかに関係なく。

result i = i++ * 2 // result = 2, i = 2
System.out.println(i); // 2

一貫したパターンを維持し、すべての値の印刷行を含めた場合:

  int i = 3; 
System.out.println(i);    //  3
System.out.println(i++);  //  3
System.out.println(i);    // "4"
System.out.println(++i);  //  5          
System.out.println(i);    // "5"
System.out.println(++i);  // "6"
System.out.println(i++);  // "6"
System.out.println(i);    // "7"
14
Yvette Colomb

のことを考える ++iおよびi++同様にi = i+1.しかし、それは同じではありません。違いは、iが新しい増分を取得するときです。

++i、インクリメントはすぐに発生します。

しかし、i++は、プログラムが次の行に移動したときに増分が発生することを示します。

ここのコードを見てください。

int i = 0;
while(i < 10){
   System.out.println(i);
   i = increment(i);
}

private int increment(i){
   return i++;
}

これにより、終了しないループが発生しますiは元の値で返され、セミコロンiの後にインクリメントされますが、返された値は返されていないためです。したがって、iが実際には増分値として返されることはありません。

5
Dilruk
System.out.println(i++);  // "6"

これはprintlnにこのコード行の前に持っていた値(6)を送信し、次にIを(7に)インクリメントします。

2
Jumbogram

変数が更新されないのはなぜですか?

  • Postfix:iの現在の値を関数に渡し、それをインクリメントします。
  • プレフィックス:現在の値をインクリメントし、関数に渡します。

私が何もしない行は何の違いもありません。

これは割り当てにも当てはまることに注意してください。

i = 0;
test = ++i;  // 1
test2 = i++; // 1
2
Steven Jeuris

最後のステートメントに対して7を出力します。上記のステートメントのcosの値は6で、最後のステートメントが出力されると7にインクリメントされます

1
Guest

一時変数の観点からよく考えてください。

i =3 ;
i ++ ; // is equivalent to:   temp = i++; and so , temp = 3 and then "i" will increment and become     i = 4;
System.out.println(i); // will print 4

さて、

i=3;
System.out.println(i++);

に等しい

temp = i++;  // temp will assume value of current "i", after which "i" will increment and become i= 4
System.out.println(temp); //we're printing temp and not "i"
0
Raj Shetty

これが私の答えです。理解しやすい人もいるでしょう。

package package02;

public class C11PostfixAndPrefix {

    public static void main(String[] args) {
        // In this program, we will use the value of x for understanding prefix 
        // and the value of y for understaning postfix. 
        // Let's see how it works. 

        int x = 5; 
        int y = 5; 

        Line 13:   System.out.println(++x);  // 6   This is prefixing. 1 is added before x is used. 
        Line 14:   System.out.println(y++);  // 5   This is postfixing. y is used first and 1 is added. 

        System.out.println("---------- just for differentiating");

        System.out.println(x);  // 6   In prefixing, the value is same as before {See line 13}
        System.out.println(y);  // 6   In postfixing, the value increases by 1  {See line 14} 

        // Conclusion: In prefixing (++x), the value of x gets increased first and the used 
        // in an operation. While, in postfixing (y++), the value is used first and changed by
        // adding the number. 
    }
}
0

この例で、より良いプレフィックス/ポストフィックスを理解できるかもしれません。

public class TestPrefixPostFix 
{
    public static void main (String[] args)
    { 
        int x=10;
        System.out.println( (x++ % 2 == 0)?"yes "+ x: " no "+x);
        x=10;
        System.out.println( (++x % 2 == 0)?"yes "+ x: " no "+x);
    }
}    
0
Lanavia