这个问题只是好奇心:我想知道在行int x
之后某些x += ++x
的价值是什么?
所以我试过了:
int x=10;
x+=++x;
System.out.println(x);
打印出来:
21
使用其他值进行一些测试后,它似乎等于x = 2x + 1。为什么?此行是否由编译器解释为字节操作? (顺便说一句,x + = x ++似乎等于x = 2x)。
我不认为这是我在项目中使用过的东西,但我很想知道为什么会得到这个结果。
感谢您提供任何解释或提示
编辑:首先,感谢您的回答
我知道+=
运算符的工作方式,以及x++
和++x
,但出于某种原因,(完全逻辑和明显的)结果对我来说似乎很奇怪
我应该已经考虑过了,抱歉你的时间!
答案 0 :(得分:9)
计算方式是
步骤2:变为x = 10 +(递增x)11
步骤3:最终结果存储在x中,即21
以下是证据:
我创建了一个MainClass,如下所示:
public class MainClass{
public static void main(String...s){
int x = 10;
x += ++x;
}
}
然后使用javap -c MainClass
public static void main(java.lang.String...);
Code:
0: bipush 10 // push 10 onto stack
2: istore_1 // store 10 in local variable 1
3: iload_1 // load local variable 1 (now 10) back to stack
4: iinc 1, 1 //increment local variable 1 by 1
7: iload_1 // load local variable 1 (now 11) back to stack
8: iadd // add top 2 variable on stack ( 10 and 11)
9: istore_1 // store 21 to local variable 1
10: return
}
答案 1 :(得分:2)
关于运算符优先级以及如何评估和使用++x
和x++
。使用++x
时,x
的值会增加,然后使用++x
变为11
,此x += ++x
变为21
{{1} }}
但是10 + 11
表示使用x++
,然后其值会递增
所以x
意味着x+= x++
,即10 + 10
答案 2 :(得分:0)
int x=10;
x+=++x;
System.out.println(x);
x + = ++x
在编译器中评估为x = x + ++x
=> x = 10 + ++x
=> x = 10 + 11
=> x = 21
答案 3 :(得分:0)
见这里: -
20
因此x = 21;
您需要了解预增量(++ x)和后增量(x ++)。见下文
x+=++x; this expression will be executed like x=x+(x+1) so x = 10 + 11
在上面的if条件中它将执行为true,因为首先它将比较为10 == 10然后x将增加1,x将变为11。
现在见下文: -
int x = 10;
if (x++ == 10 )
System.out.println( "X is equal to 10");// this statement will print
在上面的条件中,如果条件x将被预先递增,那么x将变为11,然后将进行比较,无论11 == 10,因此条件将失败。
希望这会有所帮助。
答案 4 :(得分:0)
while ($Qspecification->fetch()) {
$specification_name = $this->productsSpecificationAdmin->getSpecificationName($Qspecification->valueInt('specification_id'), $this->lang->getId());
$customers_group_id = $Qspecification->valueInt('customers_group_id');
$QspecificationName = $this->app->db->prepare('select distinct s.specification_id as id,
sd.name as name,
sgd.name as groupName
from :table_specification s
left join :table_specification_group sg ON (s.specification_group_id = sg.specification_group_id )
left join :table_specification_group_description sgd on (sg.specification_group_id = sgd.specification_group_id),
:table_specification_description sd
where s.specification_id = sd.specification_id
and s.specification_id = :specification_id
and sg.specification_group_id = sgd.specification_group_id
and sd.language_id = :language_id
and sgd.language_id = :language_id
');
$QspecificationName->bindInt('specification_id', $Qspecification->valueInt('specification_id'));
$QspecificationName->bindInt(':language_id', $this->lang->getId());
$QspecificationName->execute();
$content .= '<tr id="specification-row' . $t . '">';
$content .= HTML::hiddenField('id', $Qspecification->valueInt('id'));
$content .= ' <td>
<script type="text/javascript">
$(document).ready(function() {
$("#specificationName' . $t . '").tokenInput("' . $products_specification_ajax . '" ,
{
tokenLimit: 1,
resultsLimit: 5,
onResult: function (results) {
$.each(results, function (index, value) {
value.name = value.id + " " + value.groupName + "/" + value.name;
});
return results;
}
});
});
$(document).ready(function() {
$("#specificationName' . $t . '").tokenInput("' . $products_specification_ajax . '", {
prePopulate: [
{
id: ' . $QspecificationName->valueInt('specification_id') . ',
name: "' . $QspecificationName->valueInt('specification_id') . ' ' . $QspecificationName->value('groupName') . '/' . $QspecificationName->value('name') . '"
}
],
tokenLimit: 1
});
});
</script>
}
将返回++x
的值,(x+1)
值也会增加一个。
x
将返回x++
的值,(x)
值也会增加一个。
所以
x
与x+=++x
相同,相当于x=x+(x+1)
x=2*x+1
与x+=++x
相同,相当于x=x+(x)
答案 5 :(得分:0)
..... ++ x:首先计算x = x + 1,然后使用x进行比较或计算实际任务 ..... x ++:首先比较/计算实际任务,然后计算x = x + 1