在这个代码段中,
[1]int i=0;
[2]i = i++;
[3]System.out.println(i);
在第 2 行,它首先执行表达式(将 0 分配给 i),然后它应该将值增加 1。
在System.out.println(i)
中,我得到的答案是 0 而不是 1。有人能解释一下原因吗?
在这个代码段中,
[1]int i=0;
[2]i = i++;
[3]System.out.println(i);
在第 2 行,它首先执行表达式(将 0 分配给 i),然后它应该将值增加 1。
在System.out.println(i)
中,我得到的答案是 0 而不是 1。有人能解释一下原因吗?
i++ 不会产生一个变量,而是一个值。
i++ 产生 0。
然后 i 递增到 1。
然后将 0 分配给 i。
总结:运算符的优先级可能不是你所期望的。或者至少你可能误解了 i 的实际增量发生在哪里。向人们展示 i++ 的使用可以分为 2 行是正常的,其中后面的行进行增量 - 这并不总是正确的。它发生在赋值运算符之前。
该赋值首先保存 i 的值,然后将 i 设置为其值加 1,最后将 i 重置回其原始值。有点儿:
int temp=i;
i=i+1;
i=temp;
@chathura2020:转到此链接。它是关于序列点的。
当同一个变量在一个表达式中被多次修改时,序列点也会起作用。一个经常被引用的例子是 C 表达式 i=i++ ,它显然既赋予 i 其先前的值并增加 i。i 的最终值是不明确的,因为根据表达式求值的顺序,递增可能发生在赋值之前、之后或与赋值交错。特定语言的定义可能会指定一种可能的行为,或者简单地说该行为是未定义的。在 C 和 C++ 中,评估这样的表达式会产生未定义的行为。
(这不适用于 java)