【问题标题】:Why doesn't `index = index++` increment `index`? [duplicate]为什么`index = index++`不增加`index`? [复制]
【发布时间】:2008-12-09 22:00:25
【问题描述】:

** 重复:What's the difference between X = X++; vs X++;? **

所以,即使我知道你永远不会在代码中真正做到这一点,我仍然很好奇:

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
}

请注意,第三个sysout 仍然是1。在我看来,index = index++; 行的意思是“将索引设置为索引,然后将索引递增 1”,就像 System.out.println(index++); 表示“将索引传递给 println 方法,然后将索引递增 1”。

但情况并非如此。谁能解释一下是怎么回事?

【问题讨论】:

标签: java


【解决方案1】:

这是一个重复的问题。

编辑:我似乎找不到原件:P 哦,好吧

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

a = function() {
   var old_value = a;
   a++;
   return old_value;
}

编辑 2: What's the difference between X = X++; vs X++;?

【讨论】:

  • 原文链接是什么?
  • 找不到它:(我很确定我以前见过它:
【解决方案2】:

value++; 是后增量。

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

firstValue 现在是 10,但 secondValue 是 9,这是 firstValue 在递增之前的值。

现在有预增量:

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

firstValue 和 secondValue 现在为 10,fistValue 递增,然后将其值分配给 secondValue。

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • oic,所以 ++ 发生在解析索引之后,而不是在 (index = index) 执行之后。如果后者为真,则会导致索引增加。
    【解决方案4】:

    后自增运算符index++ 增加变量,但返回其旧值,因此

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

    将打印 5 但 i 现在等于 6。

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

    【讨论】:

      【解决方案5】:

      我从未尝试过这样的事情,但我愿意让分配发生在增量之后。

      所以就编译器而言,真正发生的是:

      1. 评估索引
      2. 保留 index 的值以备后用
      3. 增加索引值
      4. 分配索引的旧值,从而消除增量。

      【讨论】:

        【解决方案6】:

        您必须查看事物的评估顺序。

        在下面的语句中

        索引 = 索引++;

        发生了三件事 1)既然是index++,就确定index的值 2) 索引递增, 3) 然后将第一步确定的值赋给等式左边的变量

        【讨论】:

          【解决方案7】:

          this 问题的答案应该会有所帮助。后增量确实会更新 index 的值,但它会返回更新前的值。

          【讨论】:

            【解决方案8】:
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2010-12-14
            • 2012-07-27
            • 1970-01-01
            • 1970-01-01
            • 2022-11-03
            • 2021-11-11
            • 1970-01-01
            相关资源
            最近更新 更多