【问题标题】:++i+i++ evaluation++i+i++ 评估
【发布时间】:2013-05-03 16:00:36
【问题描述】:

因为this post 而引起了混乱。作者更新了帖子,结果一目了然。 结论:Java 评估表达式从从左到右

关闭!

由于表达式的评估是从从右到左完成的,因此以下代码应将5 存储在j 中:

int i=2;
int j=++i+i++;
System.out.println(j);

但我得到 6 作为输出,这迫使我重新考虑 从右到左的评估思路。请在这里解释一下理论。

【问题讨论】:

  • 理论是,任何写出这种表达方式的人都应该被枪杀。然而,上述证据表明,理论和实践存在差异。
  • @Hot Licks,我们不知道他不会因此而被枪杀。
  • 虽然计算实际上是从左到右进行的,但当从右到左计算时,您的表达式也会得到 6!
  • 参考 Tim Goodman 的回答。
  • 实际上这样写代码:非常非常糟糕。充分理解++ii++ 和评估顺序的含义,足以能够理解这样的代码:好。

标签: java unary-operator expression-evaluation


【解决方案1】:

你得到 6,因为它是 3 + 3

  • 第一个 OP 是 ++i,它递增 first(到 3)然后使用该值
  • 下一个 OP 是 +i 再次添加 3
  • 最后一个 OP ++ 不参与加法,但使用后递增 i

【讨论】:

  • 我从here得到了从右到左的困惑
【解决方案2】:

你的假设是错误的。 the documentation 是这样说的:

除了赋值运算符之外的所有二元运算符都被计算 从左到右

所以

++i+i++

等价于

(++i)+(i++)

首先评估++i

这给了

3+3

这是6(在此之后我的值是4)。

【讨论】:

    【解决方案3】:
    int i = 2;
    int j = ++i + i++;
    

    一样
    int i = 2;
    
    // This part is from ++i
    i = i + 1;
    int left = i; // 3
    
    // This part is from i++
    int right = i; // 3
    i = i + 1;
    
    int j = left + right; // 3 + 3 = 6
    

    如果你已经完成了:

    int i = 2;
    int j = i++ + ++i;
    

    这相当于:

    int i = 2;
    
    // This part is from i++
    int left = i; // 2
    i = i + 1;
    
    // This part is from ++i
    i = i + 1;
    int right = i; // 4
    
    
    int j = left + right; // 2 + 4 = 6
    

    所以总和是一样的,但是相加的项是不同的。

    【讨论】:

      【解决方案4】:

      第一个 ++ 增加 i。 + 将 i 添加到自身。我是 3。

      【讨论】:

        【解决方案5】:

        你从哪里得到它是从右到左的想法?它是从左到右的。

        What are the rules for evaluation order in Java?

        【讨论】:

          【解决方案6】:

          这就是它的工作原理,因为一元运算符的优先级高于二元:

          int i=2;
          int j =(++i)+(i++);
                  ^^^   ^^^ 
                   3  +(i++) //The value of i is now 3.
                  ^^^   ^^^
                   3  +  3   //The value of i is incremented after it is assigned.
          

          【讨论】:

            【解决方案7】:

            在评估a+b 等表达式时,在将“b”添加到“a”之前,您需要知道“a”是什么。在这种情况下,a 是 ++i,即 3,b 是 i++,即 3。从右到左计算得到 3 + 3 = 6

            【讨论】:

              【解决方案8】:

              在 Java 和 C# 中,子表达式的计算将从左到右进行:

              int j=++i + i++;
              

              包含以下两个子表达式++ii++。这些子表达式将按此顺序计算,因此这将转换为:

              int j= 3 + 3;
              

              与在 Java 和 C# 中一样,++i 将执行返回 3,但我将在第二个 i++ 之前更改为 3。第二个将返回i 的当前值,即3 现在和i++ 之后i 的值将是4

              在 C++ 中这是未定义的。

              在现实世界中,您不想输入此代码(代码打高尔夫球除外)

              【讨论】:

              • 啊……从左到右让我感觉太好了,特林爵士!现在很放松,实际上我从here 得到了从右到左的困惑
              • Sebastien 发布了这个看起来很不错的链接:stackoverflow.com/questions/6800590/…
              • @ChaZ: 从左到右适用于子表达式,如果你要写 2+4*2,4*2 将首先计算,但如果你写 (a++) + (b++) * ( c++),然后 (b++) 将被评估,然后 (c++) 然后 (b++) * (c++) ... 等等
              • BlueTrin:是的,因为* 运算符的从左到右优先。 (b++) 的第一个评估是不言自明的。
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2013-04-24
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-10-31
              相关资源
              最近更新 更多