【问题标题】:java compound assignment operator and assignment operatorjava复合赋值运算符和赋值运算符
【发布时间】:2011-11-16 13:21:21
【问题描述】:

我在理解 java 中的复合赋值运算符和赋值运算符时遇到了一些问题。有人可以向我解释这两个运算符真正是如何工作的吗? (在某处我找到了一个非常好的示例代码,它使用临时变量来解释工作,但遗憾的是我失去了它。)非常感谢你。这是我的小示例代码(我已经知道前缀和后缀运算符之间的区别):

       int k = 12;
       k += k++;   
       System.out.println(k);  // 24 -- why not (12+12)++ == 25?

       k = 12;
       k += ++k; 
       System.out.println(k); // 25 -- why not (1+12)+(1+12) == 26?               

       k = 12;
       k = k + k++; 
       System.out.println(k); // 24 -- why not 25? (12+12)++?

       k = 12;
       k = k++ + k; 
       System.out.println(k); // 25 -- why not 24 like the previous one?

       k = 12;
       k = k + ++k; 
       System.out.println(k); // 25 -- OK 12+(1+12)

       k = 12;
       k = ++k + k; 
       System.out.println(k); // 26 -- why?

【问题讨论】:

  • 逻辑基础是++k加在主操作之前,k++中主操作先执行。

标签: java variable-assignment operator-keyword


【解决方案1】:

请注意,在所有情况下,对 k 的赋值会覆盖任何可能发生在右侧的增量。

将 cmets 串联起来:

   int k = 12;
   k += k++;   
   System.out.println(k);  // 24

k++ 表示在您使用该值之后递增,因此这与编码k = 12 + 12

相同
   k = 12;
   k += ++k; 
   System.out.println(k); // 25

++k 表示在您使用该值之前递增,所以这与编码k = 12 + 13

相同
   k = 12;
   k = k + k++; 
   System.out.println(k); // 24

k++ 表示在您使用该值之后 递增,因此这与编码k = 12 + 12

相同
   k = 12;
   k = k++ + k; 
   System.out.println(k); // 25

k++ 表示在您使用该值之后 递增,因此这与编码k = 12 + 13

相同
   k = 12;
   k = k + ++k; 
   System.out.println(k); // 25

++k 表示在您使用该值之前 递增,因此这与编码 k = 12 + 13

相同
   k = 12;
   k = ++k + k; 
   System.out.println(k); // 26

++k 表示在使用该值之前递增,然后再次使用该值,因此这与编码k = 13 + 13 相同

【讨论】:

  • +1 - 该死,打败我!
  • 第4个例子k = k++ + k应该等价于k = 12 + 13吧?
  • 对不起 - 你是对的(我现在修好了)。复制粘贴有点太多了:(
  • 谢谢!剩下的唯一问题是第一个示例中的 ++ 在哪里?我的意思是 k = 12+12 是可以的,但是你也有一个 k++,它在赋值之后出现:k = 12+12; k = k+1; => k 应该是 25。我的逻辑错误在哪里?再次感谢!
【解决方案2】:

下面是对第一种情况的详细解释:

int k = 12; k += k++; System.out.println(k);

k += k++; 等价于: k = k + (k++);

k + (k++); 从左到右求值。
第一个 k 的值为 12。 k++ 被评估为 k 的原始值(即 12); k 稍后递增。

其他帖子很好地解释了其他案例。


但这里有一个有趣的案例,它显示了从左到右的评估和右侧的后增量:

int k = 12; k = k + k++ + k; System.out.println(k);

k + (k++) + k; 从左到右求值。
第一个 k 的值为 12。
第二个k:k++被评估为k的原始值(即12); k 稍后递增。
第三个 k:现在 k 的增量值为 13(因为它位于第二个 k 之后)。
总结果为 37(即 12 + 12 + 13)。

【讨论】:

    【解决方案3】:

    从这里完成一点: http://www.coderanch.com/how-to/java/PostIncrementOperatorAndAssignment

    让我们仔细看看“i = i++;”这一行是什么确实:

    “i++”被评估。 “i++”的值是在增量发生之前 i 的值。 作为“i++”评估的一部分,i 加一。现在 i 的值为 1; 分配被执行。 i 被分配了“i++”的值,即在增量之前 i 的值——即 0。 即“i = i++”大致翻译为

    int oldValue = i; 
    i = i + 1;
    i = oldValue; 
    

    换句话说,一个常见的误解是增量是最后发生的。对表达式求值时立即执行增量,并记住增量之前的值,以备将来在同一语句中使用。

    【讨论】:

      猜你喜欢
      • 2015-03-19
      • 2015-05-02
      • 2020-12-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-21
      • 2011-08-02
      • 2019-10-06
      • 1970-01-01
      相关资源
      最近更新 更多