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"
}
}
From the program below or here, why does the last call to System.out.println(i)
print the value 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"
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(11)
这会打印出“6”,因为它接受 i,加 1,然后返回值:5+1=6。这是前缀,在操作中使用之前添加到数字中。
这会打印出“6”,因为它需要 i,存储一个副本,向变量加 1,然后返回该副本。这样你就得到了 i 的值,但同时也增加了它。因此,您打印出旧值,但它会增加。后缀增量的美妙之处。
然后,当您打印出 i 时,它会显示 i 的实际值,因为它已增加:7。
This prints out "6" because it takes i, adds one to it, and returns the value: 5+1=6. This is prefixing, adding to the number before using it in the operation.
This prints out "6" because it takes i, stores a copy, adds 1 to the variable, and then returns the copy. So you get the value that i was, but also increment it at the same time. Therefore you print out the old value but it gets incremented. The beauty of a postfix increment.
Then when you print out i, it shows the real value of i because it had been incremented: 7.
另一种说明方式是:
++i
将给出new i
的结果,i++
将给出原始的结果>i
并存储新的 i 以供下一步操作。一种思考方式是,在表达式中做其他事情。当您打印
i
的当前值时,它将取决于i
是在表达式内还是在表达式之后发生更改。i
在计算结果之前进行评估(更改)。打印此表达式的i
,显示用于此表达式的i
的更改值。i
在计算结果后进行评估。因此,从此表达式打印i
给出了该表达式中使用的i
的原始值,但仍会更改i
以供进一步使用。因此,在表达式之后立即打印i
的值,将显示i
的新增量值。由于i
的值发生了变化,无论是打印还是使用。如果您保持一致的模式并包含所有值的打印行:
Another way to illustrate it is:
++i
will give the result of thenew i
,i++
will give the result of the originali
and store thenew i
for the next action.A way to think of it is, doing something else within the expression. When you are printing the current value of
i
, it will depend upon whetheri
has been changed within the expression or after the expression.i
is evaluated (changed) before the result is calculated. Printingi
for this expression, shows the changed value ofi
used for this expression.i
is evaluated after the result in calculated. So printingi
from this expression gives the original value ofi
used in this expression, buti
is still changed for any further uses. So printing the value fori
immediately after the expression, will show the new incremented value ofi
. As the value ofi
has changed, whether it is printed or used.If you kept a consistent pattern and included print lines for all the values:
将
++i
和i++
视为与i = i+1类似。
但它不一样。不同之处在于i
获取新增量的时间。在
++i
中,增量立即发生。但如果存在
i++
,则当程序转到下一行时就会发生增量。看看这里的代码。
这将导致无休止的循环。因为
i
将返回原始值,在分号之后,i
将增加,但返回值并未增加。因此,i
实际上永远不会作为递增值返回。Think of
++i
andi++
as similar toi = i+1.
But it is not the same. The difference is wheni
gets the new increment.In
++i
, the increment happens immediately.But if
i++
is there, the increment will happen when the program goes to the next line.Look at the code here.
This will result in a nonending loop. Because
i
will be returned with the original value and after the semicolon,i
will get incremented, but the returned value has not been. Thereforei
will never actually returned as an incremented value.为什么变量没有被更新?
你不与我做任何事情的行没有什么区别。
请注意,这对于作业也是如此:
Why wouldn't the variable have been updated?
The lines where you don't do anything with i make no difference.
Notice that this is also true for assignments:
这将发送
println
我在这行代码 (6) 之前获得的值,然后将 I 递增(到 7)。This sends
println
the value I had prior to this line of code (6), and then increments I (to 7).实际运算符如何实现的示例:
An example of how the actual operators are implemented:
也许通过这个例子你可以更好地理解 Prefix/postfix。
Maybe you can understand better Prefix/postfix with this example.
这可能很容易理解:
This may be easy to understand:
它为最后一个语句打印7,因为在上面的语句中,它的值为6,并且当打印最后一个语句时它会增加到7。
It prints 7 for the last statement, because in the statement above, its value is 6 and it's incremented to 7 when the last statement gets printed.
这可能会有所帮助......我也需要理解这个难题。
This might help... it also took my to understand this puzzle.
好吧,从临时变量的角度来考虑它。
现在,
相当于
Well, think of it in terms of temporary variables.
Now,
is equivalent to