x + = ++ x相当于x = 2x + 1:为什么?

时间:2018-03-30 13:35:41

标签: java

这个问题只是好奇心:我想知道在行int x之后某些x += ++x的价值是什么? 所以我试过了:

int x=10;
x+=++x;
System.out.println(x);

打印出来:

21

使用其他值进行一些测试后,它似乎等于x = 2x + 1。为什么?此行是否由编译器解释为字节操作? (顺便说一句,x + = x ++似乎等于x = 2x)。

我不认为这是我在项目中使用过的东西,但我很想知道为什么会得到这个结果。

感谢您提供任何解释或提示

编辑:首先,感谢您的回答

我知道+=运算符的工作方式,以及x++++x,但出于某种原因,(完全逻辑和明显的)结果对我来说似乎很奇怪 我应该已经考虑过了,抱歉你的时间!

6 个答案:

答案 0 :(得分:9)

计算方式是

  • 步骤1:x = x + ++ x
  • 步骤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)

关于运算符优先级以及如何评估和使用++xx++。使用++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)值也会增加一个。

所以

xx+=++x相同,相当于x=x+(x+1)

x=2*x+1x+=++x相同,相当于x=x+(x)

答案 5 :(得分:0)

..... ++ x:首先计算x = x + 1,然后使用x进行比较或计算实际任务 ..... x ++:首先比较/计算实际任务,然后计算x = x + 1