为什么以下代码1的输出而不是0?

时间:2017-09-06 08:27:04

标签: java integer

    @Test
    public void test(){
        Map<String, Integer> a = new HashMap<>();
        a.put("x", new Integer(0));
        Integer i = a.get("x");
        a.put("x", i++);
        i = a.get("x");
        a.put("x", i++);
        i = a.get("x");
        a.put("x", i++);
        System.err.println(i);
    }

上面代码的输出是1而不是0.我无法弄清楚为什么。有人可以解释最新情况吗? Java的一些字节代码优化会导致这种状态吗?

6 个答案:

答案 0 :(得分:4)

因为i++在递增之前返回i i。看我的评论:

Map<String, Integer> a = new HashMap<>();
a.put("x", new Integer(0)); // x=0
Integer i = a.get("x");     // i=0
a.put("x", i++);            // x=0, i=1
i = a.get("x");             // i=0
a.put("x", i++);            // x=0, i=1
i = a.get("x");             // i=0
a.put("x", i++);            // x=0, i=1
System.err.println(i);

以下是documentation of unary operators的相关部分:

  

可以在操作数之前(前缀)或之后(后缀)应用递增/递减运算符。代码result++;++result;都将以结果递增1结束。

     

唯一的区别是前缀版本(++result)评估为递增值,而后缀版本(result++)评估为原始值。

     

如果您只是执行简单的递增/递减,那么选择哪个版本并不重要。但是,如果您在较大的表达式中使用此运算符,则您选择的运算符可能会产生显着差异。

答案 1 :(得分:1)

是的,它应该是一个。最后一条语句为a.put("x", i++);,因此您将值0放入Map,但随后增加i。如果您的上一个陈述是i = a.get("x");,那么您将获得0

答案 2 :(得分:1)

您使用后增量,因此首先读取i的值,然后递增。

 @Test
public void test(){
    Map<String, Integer> a = new HashMap<>();
    a.put("x", new Integer(0));
    Integer i = a.get("x"); // i is 0
    a.put("x", i++); // x = 0; then i increment
    i = a.get("x"); // i is reset to 0
    a.put("x", i++); // x = 0; then i increment
    i = a.get("x"); // i is reset to 0
    a.put("x", i++); // x = 0; then i increment
    System.err.println(i); // i == 1
}

答案 3 :(得分:0)

内联解释:

public function your_function(){

    $list_id = $this->input->post('id');
    echo $list_id;

}

由于存储的值始终为0,并且您在结束时获得它并递增它,因此最终得到1.

答案 4 :(得分:0)

让我们一步一步地完成这个步骤:

    Integer i = a.get("x");

我是0

    a.put("x", i++);
&#34; x&#34;在地图中没有变化,因为你将它设置为i(= 0)并在设置后增加。

    i = a.get("x");

我再次设置为0,因为那些仍然存储在&#34; x&#34;

    a.put("x", i++);

与上面相同,只有在设置&#34; x&#34;后才能设置为1。到0

    i = a.get("x");

i = 0

    a.put("x", i++);

现在我是1,你打印它

    System.err.println(i);

答案 5 :(得分:0)

你的最后一句话使我增加1,结果i = 1.