作业给出意想不到的答案

时间:2014-02-02 12:29:13

标签: java

今天我遇到了以下问题,我似乎无法找到解决方案:

int i, j, k;

i = j = k = 3;

i = k++;

因此我认为变量'i'现在必须具有值4,因为我们为其分配了'k'的增量。在多项选择测试中,第三行之后的正确值是:

k = 4

i != 4

既然我们将k的增量分配给i,那么给定的解决方案怎么会与我的预期完全相反? 提前谢谢!

1 个答案:

答案 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 在调用方法时已经增加,但传递给方法的值仍然是原始值。