【问题标题】:Question about post-increment operator关于后自增运算符的问题
【发布时间】:2010-01-17 12:56:52
【问题描述】:

为什么下面的代码

int i = 1; 
System.out.print(i += i++);
System.out.print(i);

第二次打印输出 2 两次而不是 3?

有人能解释一下吗?

谢谢。

【问题讨论】:

  • 应该注意的是,在现实世界中你永远不应该这样编码。从不。
  • @Grey:是的,只是想弄清楚这一点

标签: java post-increment


【解决方案1】:

如果你意识到 a++ 的工作方式如下(伪代码):

func ++(ref a)
{
    int b=a;
    a=a+1;
    return b;
}

那么一切都说得通了。

【讨论】:

  • ref 对于 Java 程序员来说有点不平凡,你知道 ;)
  • 嗯。对于那些不理解 ref 部分的人,我试图证明在 (a) 中传递的变量的值在调用站点被这个函数改变了。
【解决方案2】:

看起来我最终应该是 3。

但是,如果您更仔细地查看该声明

i += (i++)

等于

i = ( i + (i++) ) 

在本例中为 1+1。

如您所料,i++ 的副作用是 i=i+1=1+1=2,但是 i 的值在赋值后会被覆盖。

【讨论】:

    【解决方案3】:

    我还不太了解 Java 字节码语法,但根据我的字节码级别,您的代码看起来像这样:

    int i = 1;  // iconst_1:    variables { }, stack {1}
                // istore_1:    variables {1}, stack { }
    i += i++;   // iload_1:     variables {1}, stack {1}
                // iinc 1, 1:   variables {2}, stack {1}
                // iadd:        variables {2}, stack {2} ...Note that here 1 gets added to the value on stack
                // istore_1:    variables {2}, stack {2} ...Here the variable value will overwrite the stack value
    

    我认为这可以很好地解释您的输出。 :-)

    各位高手,如有错误请指正...

    【讨论】:

      【解决方案4】:

      我不认为这是不知道后缀一元运算符 (expr++) 如何工作的问题。造成混乱的是评估语句的顺序。

      int i = 1;
      System.out.println(i += i++); // Output: 2
      

      所以最后一条语句与下面两条语句的顺序相同:

      i++; // i is now 2 for the rest of this statement and the program
      i = 1 + 1; // i is assigned again  
      

      所以先计算后缀运算符,然后计算整行,但使用 i 的前一个值。

      所以,再举一个更清楚的例子:

      int i = 2;
      System.out.println(i += i++); // Output: 4
      System.out.println(i); // Output: 4  
      

      还有一个例子:

      int i = 2;
      System.out.println(i = i + i++ + i--); // Output: 7
      System.out.println(i); // Output: 7  
      

      第二行是赋值i。第一个i是2,下一个i也是2,但是现在第三个i是3,因为i++已更改 i 的值。和之前一样,i-- 不会对 i 产生任何影响,因为它会被重写为 i = 2 + 2 + 3

      int i = 1;
      System.out.println(i = i++ + i); // Output: 3
      System.out.println(i); // Output: 3
      

      【讨论】:

        【解决方案5】:
        1 + 1 == 2. 
        

        因此:

        i + i == 2  
        

        i += i == 2
        

        然后

        i += i++ == 2
        

        非常直接。

        【讨论】:

        • 后自增运算符这里恐怕没有真正解释。
        猜你喜欢
        • 2013-08-22
        • 2011-01-08
        • 2019-12-23
        • 2011-11-15
        • 1970-01-01
        • 2019-12-16
        • 2011-02-14
        • 2011-04-17
        • 1970-01-01
        相关资源
        最近更新 更多