通过以下程序或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"
}
}
答案 0 :(得分:63)
i = 5;
System.out.println(++i); //6
这打印出“6”,因为它需要我添加一个并返回值。 5 + 1 = 6;这是前缀,在操作中使用前添加数字。
i = 6;
System.out.println(i++); //6 (i = 7, prints 6)
这打印出“6”,因为它需要i,存储副本,添加1并返回副本。所以你得到了我的价值,但也同时增加了它。因此,您打印出旧值但它会增加。后缀增量的美妙。
然后当你打印出i时,它会显示i的真实值,因为它已经增加了。 7
答案 1 :(得分:14)
我知道这已被回答,但认为另一种解释可能会有所帮助。
另一种说明方式是:
++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"
答案 2 :(得分:4)
将++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
实际上永远不会以递增的值返回。
答案 3 :(得分:2)
System.out.println(i++); // "6"
这将println
发送到此代码行之前的值(6),然后递增I(到7)。
答案 4 :(得分:2)
为什么变量没有更新?
你对我没有做任何事情的行没有任何区别。
请注意,分配也是如此:
i = 0;
test = ++i; // 1
test2 = i++; // 1
答案 5 :(得分:1)
它为上一个语句中的最后一个语句cos打印 7 ,它的值为 6 ,并且当它增加到7时最后一个声明被打印
答案 6 :(得分:0)
从临时变量的角度考虑它。
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"
答案 7 :(得分: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);
}
}
答案 8 :(得分:0)
这是我的答案。你们中的一些人可能会觉得很容易理解。
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.
}
}
答案 9 :(得分:0)
我知道这是一个非常老的问题,但我没有列出此类答案。看一个如何实现实际运算符的示例对我有帮助,也许对其他人有帮助
class Integer {
private int __i;
function Integer ++() { // prefix operator i.e. ++x
__i+=1; //increment
return this; //return object with incremented value
}
function Integer ++(Integer x) { //postfix operator i.e. x++
__i+=1; //increment
return x; //return original object
}
}
答案 10 :(得分:0)
这可能会有所帮助..我也需要理解这个谜题..
公共类主{ public static void main(String[] args) {
int x = 5;
int y=5;
System.out.println(++x);
System.out.println(y++);
System.out.println("------");
System.out.println(x);
System.out.println(y);
} }