【问题标题】:Why is java increment operator ( in part of a larger expression) works different?为什么 java 增量运算符(在较大表达式的一部分)的工作方式不同?
【发布时间】:2013-12-18 10:38:30
【问题描述】:

在 Java 教程中写 ' 唯一的区别是前缀版本 (++result) 计算为递增值,而后缀版本 (result++) 计算为原始值。 '

如果它们具有相同的运算符(但运算符的顺序不同......),为什么这个表达式的结果会不同?

    //here:

    int i8 = 2;
    i8 = (++i8*i8++) + i8;

     //this is simple
    //  i8 = (3*3) + 3
    // i8 + 1 = 13

    System.out.println("i8 = " + i8);
    // i8 = 13

    int i9 = 2;
    i9 = i9 + (++i9 * i9++);

    //  i9 = 2 + ( 3*3)
    //why 2? if ++i9 has a first priority and don't adds to incremented value 1 
    // i9 = 11
    //why i9++ don't add a 1??

    System.out.println("i9 = " + i9);
    // i9 = 11

    // another example:

    int i10 = 2;
    i10 = ++i10 * i10 + i10;
    System.out.println("i10 = " + i10);
    // i10 = 12

    int i11 = 2;
    i11 = i11 + ++i11 * i11;
    System.out.println("i11 = " + i11);
          //i11 = 11

    /* print out
     * 
    i8 = 13
    i9 = 11
    i10 = 12
    i11 = 11
    */

我想了解它是如何工作的。为什么在示例中 i8 结果 = 13,但在下一个示例中 i9 结果 = 11。为什么在第二个示例 (2 + (3*3)) 中,第一个值为 2 (但在第一个 (3*3) + 4) 中,如果优先级的第一个运算符必须是 ++i9 ,之后的 i9 = 3和 (3 + (3*3)) ?

【问题讨论】:

  • 什么意思?它是这样制作的。这就是它的工作原理,你期待什么样的答案?
  • 看起来像家庭作业......我的 C 教授喜欢用指针算术来做这些事情。
  • 是的,想了解它是如何工作的

标签: java expression increment


【解决方案1】:

这是因为表达式是从 left-to-right 计算的。

分步分手:

0. i9 = 2
1. i9 + (++i9 * i9++);
2. 2 + (3 * 3) // assigning values from left to right(i9++ won't take effect as of now since its post increment)
3. 2 + (9) // VBODMAS rule is applied here
4. i9 = 11 // Your output

这同样适用于所有其他示例,您可以看到它会根据您得到的答案进行评估。

【讨论】:

  • 1. ++i9 i9=3 赖特? 2. (3 * 3) 3. 2+ 9. 为什么乘法运算中的第二个值是 3,而在运算中加法是 2 (2 + (3*3) if i9 = 3
【解决方案2】:

这里是一步一步的解释:

                             | value of a
-----------------------------------------
0.)  a = a + (++a * a++);    |          2  (This is the initial setup)
1.)  a = 2 + (++a * a++);    |          2
2.)  a = 2 + (3 * a++);      |          3
3.)  a = 2 + (3 * 3);        |          4
4.)  a = 11;                 |         11

诀窍在第 3 步:这里,在表达式 (3 * 3) 中使用值之后,a 会递增。但是在第 4 步中,另一个值被分配给 a:整个表达式的结果。此时4 的值被“吞噬”了。

检查here,了解运算符优先级关联性,这也可以解释其他情况。

【讨论】:

  • 我也想过这个。但是对于其他情况,这仍然应该是正确的
  • 好的。为什么第一个值 = 2?如果第一个运算符 ++a 按优先顺序排列。
  • 表达式从左到右求值。所以:最左边的a(在你的情况下i9 = i9 + (++i9 * i9++);是最左边的i9)没有运算符。因此,它按原样进行评估。
猜你喜欢
  • 1970-01-01
  • 2014-09-04
  • 1970-01-01
  • 2020-06-26
  • 1970-01-01
  • 2019-12-03
  • 2016-05-01
相关资源
最近更新 更多