【问题标题】:Why java statement evaluation is happening like these ?为什么 java 语句评估会像这样发生?
【发布时间】:2012-08-15 17:07:41
【问题描述】:
int z = 1;
System.out.println(z++ == ++z);
System.out.println(++z == z++);

输出将是:

false
true

我不明白为什么,请给我解释一下。

【问题讨论】:

  • @DaoWen 不完全是重复的——当一条语句包含多个前置/后置增量运算符时,每个操作数的执行顺序才是最重要的(假设人们了解单个 ++x 与x++)。您指向的问题使用加法运算符(恰好也是左关联),而不是相等运算符。
  • @assylias - 我想这是真的。我认为“解释 Java 中 post 和 pre increment 运算符的工作”是这个问题的更好标题。 :)

标签: java post-increment pre-increment


【解决方案1】:

语句++z返回z的增量值,而z++返回增量之前的值,然而z++表达式返回后z的值是z的增量值。

所以

int z = 1;                                        // Line 1
System.out.println(z++ == ++z);                   // Line 2
System.out.println(++z == z++);                   // Line 3

在第 2 行中,z++ 返回 1,z 的值在返回后递增,因此 z 现在为 2,++z 在返回之前递增值,因此 z 为 3。因此第 2 行是

System.out.println(1 == 3);

这是

在第 3 行中,++z 的计算结果为 4(因为 z 的前一个值是 3)并且 z++ 再次返回 z 的前一个值,即 4,但现在 z 是 5。因此第 3 行是

System.out.println(4 == 4);

这是真实

【讨论】:

    【解决方案2】:

    首先你应该清楚前增量和后增量 让我们看看

    int i=1;
    int j=i++;
    int k=++i;
    

    这里j 的值将是1k 将是3

    为什么意味着在i++ 中首先将值i 存储到j 中,然后增加i 的值所以

    j=1,i=2 ok :)
    

    现在在 ++i 的情况下,首先增加值,然后存储到 k 所以

    k=3,i=3 ok :)
    

    现在我来回答你的问题

    int z = 1; System.out.println(z++ == ++z);
    

    那么告诉我z++ 是什么? 1 好:) 因此++z 会是? 3so 语句将打印 false ok :) 和第二种情况

    System.out.println(++z == z++);
    

    ++z 将是 4z++ 将是 4 所以你得到了 true 所以希望你清楚...

    【讨论】:

    • 感谢 jenuine :) 我最喜欢你的回答,你的解释甚至可以清除婴儿 :) 谢谢 :)
    【解决方案3】:
    System.out.println(z++ == ++z); // 1 == 3 is false
    System.out.println(++z == z++); // 4 == 4 is true
    

    虽然使用后增量值被复制到临时变量“tmp”中,请在此处查看postincrement。 所以z++ == ++z => 计算结果为1 == 3,这是错误的。现在 z 是 3。

    来到第二个表达式:++z == z++,再次:++z 变为 4,在 z++ 的情况下,值被复制到 tmp 变量中并在 z++ 中使用。表达式变为4 == 4,这是真值,最终值为z is 5

    【讨论】:

    • 没有投反对票,但是您没有添加任何关于为什么会发生这种情况的真正解释。假设 OP 不理解 pre-inc 或 post-inc 运算符。 =)
    【解决方案4】:

    == 运算符优先考虑其左侧的值,换句话说,由于它对 2 个值进行运算,因此首先计算左侧的值。

    var 的标签前的运算符++ 表示在计算它之前将增量分配给该值,放在标签后的相同运算符会导致后增量,这意味着变量的值增加了1 评估后。

    关于代码的第二行:

    • 操作员== 向左看
    • 运算符将z 评估为1
    • 操作员已经完成了左侧部分,但是由于您的z++ 而进行了增量,这只是说,在评估z 之后增加,所以现在z2,但由== 运算符为 1,记住这一点。
    • 运营商==向右看
    • 由于++z,操作员无法在不增加增量的情况下评估z 中的内容,这意味着z 被评估为3

    1 != 3.

    相同的概念适用于下一行。

    【讨论】:

      【解决方案5】:

      Operands of == are evaluated left to right,而++的优先级更高,所以你的代码相当于:

      int z = 1;
      int tmp1 = z++; //tmp1 = 1 / z = 2
      int tmp2 = ++z; //tmp2 = 3 / z = 3
      System.out.println(tmp1 == tmp2);
      
      tmp1 = ++z; //tmp1 = 4 / z = 4
      tmp2 = z++; //tmp2 = 4 / z = 5
      System.out.println(tmp1 == tmp2);
      

      我假设您了解z++++z 之间的区别:

      • tmp1 = z++; 可分解为:tmp1 = z; z = z + 1;
      • tmp2 = ++z; 可以分解为:z = z + 1; tmp2 = z;

      【讨论】:

      • 如果你打算分解它并使用tmp vars 来保存中间值,也许你应该显示前增量和后增量运算符实际扩展为什么。
      【解决方案6】:
      int z = 1;
          System.out.println(z++ == ++z);
          System.out.println(++z == z++);
      

      z++ 是后增量,++z 是前增量。后自增在计算表达式后增加值,前自增在计算表达式前增加值。

      因此,

      int z = 1;
          System.out.println(z++ == ++z); // 1 == 3 false
          System.out.println(++z == z++);// 4 == 4 true
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-13
        • 2018-09-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多