@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的一些字节代码优化会导致这种状态吗?
答案 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.