今天我遇到了以下问题,我似乎无法找到解决方案:
int i, j, k;
i = j = k = 3;
i = k++;
因此我认为变量'i'现在必须具有值4,因为我们为其分配了'k'的增量。在多项选择测试中,第三行之后的正确值是:
k = 4
和
i != 4
既然我们将k的增量分配给i,那么给定的解决方案怎么会与我的预期完全相反? 提前谢谢!
答案 0 :(得分:32)
首先,如JB Nizet所述,不要这样做。偶尔我会在另一个表达式中使用后缀增量,对于像array[index++] = value;
这样的事情,但为了清楚起见,我经常会将其分为两个语句。
我不打算回答这个问题,但所有答案(发布时)都犯了同样的错误:这不是计时的问题完全;这是表达式k++
的价值问题。
在i
增加之后<{1}}的作业发生 - 但表达式k
的值是k++
的原始值,而不是递增的值。
所以这段代码:
k
相当于:
i = k++;
来自section 15.14.2 of the JLS(强调我的):
[...]否则,将值1添加到变量的值中,并将总和存储回变量中。在添加之前,对值1和变量的值执行二进制数字提升(第5.6.2节)。如果必要,在存储之前,通过缩小的基元转换(第5.1.3节)和/或经过装箱转换(第5.1.7节)将总和缩小到变量的类型。 后缀增量表达式的值是存储新值之前变量的值。
这种差异非常重要,如果不使用后缀表达式进行赋值,则可以很容易地看到,您调用方法:
int tmp = k;
k++;
i = tmp;
结果是:
public class Test {
private static int k = 0;
public static void main(String[] args) throws Exception {
foo(k++);
}
private static void foo(int x) {
System.out.println("Value of parameter: " + x);
System.out.println("Value of k: " + k);
}
}
正如您所看到的,Value of parameter: 0
Value of k: 1
在调用方法时已经增加,但传递给方法的值仍然是原始值。