关于Java:为什么”index = index ++”不执行

Why doesn't `index = index++` increment `index`?

本问题已经有最佳答案,请猛点这里访问。

**dup:x=x++;与x++;有什么区别?**

所以,尽管我知道你永远不会在代码中这样做,我还是很好奇:

1
2
3
4
5
6
7
8
9
10
public static void main(String[] args) {
    int index = 0;
    System.out.println(index);   // 0
    index++;
    System.out.println(index);   // 1
    index = index++;
    System.out.println(index);   // 1
    System.out.println(index++); // 1
    System.out.println(index);   // 2
}

注意,第3个sysout仍然是1。在我看来,index = index++;行的意思是"将索引设置为索引,然后将索引增加1",与System.out.println(index++);行的意思相同,"将索引传递到println方法,然后将索引增加1"。

但情况并非如此。有人能解释一下发生了什么事吗?


这是一个重复的问题。

编辑:我好像找不到原版了:哦,好吧

A=A++使用后增量,编译器将其解释为:

1
2
3
4
5
a = function() {
   var old_value = a;
   a++;
   return old_value;
}

编辑2:x=x++;与x++;有什么区别?


value++;为后增量。

1
2
int firtValue = 9;
int secondValue = firstValue++;

firstvalue现在是10,secondvalue是9,firstvalue在递增之前的值。

现在使用预增量:

1
2
int firtValue = 9;
int secondValue = ++firstValue;

firstvalue和secondvalue现在为10,fistvalue递增,然后将其值指定为secondvalue。


我从来没有尝试过这样的方法,但我愿意让这个任务发生在增量之后。

因此,就编译器而言,真正发生的事情是:

  • 评价指标
  • 保留索引值供以后使用
  • 增加索引值
  • 指定索引的旧值,从而清除增量。

  • 后递增运算符index++使变量递增,但返回其旧值,因此

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

    将打印5,但我现在等于6。

    如果要在增量操作后返回值,请使用++index


    赋值发生在表达式被计算之后。所以index++的值为0,尽管作为副作用的索引是递增的。然后将值(0)分配给索引。


    你必须看事物被评估的顺序。

    在下面的语句中

    索引=索引++;

    发生了三件事1)由于是index++,所以确定了index的值。2)索引递增,3)然后将步骤1中确定的值分配给方程式左侧的变量。


    有关后缀评估规则的信息,请参阅http://java.sun.com/docs/books/jls/second_edition/html/typesValues.doc.html。

    还可以看到http://java.xun.com /docs/jords/js/dixyEdit/HTML/Actudio.doc.html 39438信息。


    这个问题的答案应该有帮助。后增量确实会更新索引的值,但会返回更新前的值。