【问题标题】:What does this mysterious code do? [closed]这个神秘的代码有什么作用? [关闭]
【发布时间】:2012-09-28 14:12:41
【问题描述】:

我的代码:

public void mysterious() {
    int x = 1;
    x = x++ / ++x;
    System.out.println(x);
}

答案是什么?

【问题讨论】:

  • 我总是按预期得到0,所以我不知道你为什么会得到2
  • 我正要说 0,你得到 1 / 3 这是 0.33,当转换为 int(在这种情况下)是 0。
  • 1 / 3 在整数除法中为 0,无需强制转换。 ;)
  • 简单的方法是用这个替换你的表达式:x = x / (2 + x) // x++ / ++x

标签: java


【解决方案1】:
int x = 1;
x = x++ / ++x;
System.out.println(x);

评估是从左到右进行的:-

  • 首先评估 x++。所以,它将是 1
  • 然后 x 将增加 1.. 对于后增量..
  • 然后++x 被评估。这将是3(因为x 在x++ 之后递增)

所以,基本上,你上面的代码相当于:-

int x = 1;
int a = x++;   // a = 1, x = 2
int b = ++x;   // b = 3, x = 3
x = a / b;     // x = 1 / 3
System.out.println(x); // Prints 0

【讨论】:

    【解决方案2】:

    这个表达式的计算是从左到右执行的。这个表达式等价于递增求值后的这个表达式:

    x = 1/3;
    

    因此,答案是0;

    【讨论】:

      【解决方案3】:
      public void mysterious() {
          int x = 1;
          x = x++ / ++x;
          System.out.println(x);
      }
      

      x = 1; // 将整数值 1 赋给变量 x

      x = x++ / ++x;
      

      让上面的语句分成2个不同的语句。

      x++ - PostIncrement,x的值加1,所以现在它的值是2,那么

      x++ - PreIncrement,x 的值再次递增并分配给左侧的 x,所以现在是 3。

      System.out.println(x);
      

      所以它将是1/3,这将导致0,如果你使用double而不是int,你会看到值是0.33333333

      【讨论】:

        猜你喜欢
        • 2014-12-08
        • 1970-01-01
        • 2012-09-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-03
        相关资源
        最近更新 更多