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