以下のプログラムまたは 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"
}
}
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
これは回答済みですが、別の説明が役立つと思います。
それを説明する別の方法は次のとおりです。
++i
はnew 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"
のことを考える ++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
が実際には増分値として返されることはありません。
System.out.println(i++); // "6"
これはprintln
にこのコード行の前に持っていた値(6)を送信し、次にIを(7に)インクリメントします。
変数が更新されないのはなぜですか?
私が何もしない行は何の違いもありません。
これは割り当てにも当てはまることに注意してください。
i = 0;
test = ++i; // 1
test2 = i++; // 1
最後のステートメントに対して7を出力します。上記のステートメントのcosの値は6で、最後のステートメントが出力されると7にインクリメントされます
一時変数の観点からよく考えてください。
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"
これが私の答えです。理解しやすい人もいるでしょう。
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.
}
}
この例で、より良いプレフィックス/ポストフィックスを理解できるかもしれません。
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);
}
}