Java:增量/减量运算符的前缀/后缀?

从下面或这里的程序,为什么最后一次调用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 

这打印出“6”,因为它需要我加一个,并返回值。 5 + 1 = 6; 这是前缀,在操作中使用它之前添加到数字中。

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

这打印出“6”,因为它需要我,存储副本,加1和返回副本。 所以你得到了我的价值,同时也增加了价值。 因此,您打印出旧的值,但它会增加。 一个后缀增量的漂亮。

那么当你打印我时,它显示了我的实际价值,因为它已经增加了。 7

我知道这已经得到了答复,但认为另一种解释可能会有所帮助。

另一种说明方法是:

++i会给new i的结果new ii++会给原来的结果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" 

++ii++成SIMILAR到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++; } 

这将导致非结束循环 。 因为我将被返回与原来的价值和分号后,我会得到增加,但返回的价值还没有。 因此,我永远不会实际返回作为一个递增的价值。

为什么变量没有被更新?

  • Postfix:将当前的i值传递给函数,然后递增。
  • 前缀:递增当前值,然后将其传递给函数。

我不会做任何事情的地方,我没有任何区别。

请注意,对于作业也是如此:

 i = 0; test = ++i; // 1 test2 = i++; // 1 
 System.out.println(i++); // "6" 

这发送了println之前的这行代码(6)的值,然后递增I(到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" 

也许你可以更好地理解这个例子的前缀/后缀。

 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); } } 

这是我的答案。 你们中有些人可能会觉得很容易理解。

 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. } }