【问题标题】:i and i=i++ in for loop java [duplicate]for循环java中的i和i = i ++ [重复]
【发布时间】:2013-04-26 11:28:43
【问题描述】:

这种行为背后的逻辑是什么?

 int i=0;
    for(int k=0;k<10;k++){
    i++;
    }
    System.out.println("i="+i);

Output=10; //Exepcted



 int i=0;
    for(int k=0;k<10;k++){
    i=i++;
    }
    System.out.println("i="+i);

Output=0; //Surprised :) 

任何人都可以对上述功能有所了解吗?

【问题讨论】:

标签: java for-loop


【解决方案1】:

i = i++ 是一个后缀递增运算符 - 它递增 i,然后将其返回到其原始值(因为 i++ 本质上是“返回”i 在递增之前的值。)

i = ++i 可以工作,因为它是一个前缀增量运算符,并且会在增量后返回 I 的值。但是,您可能只想在此处执行 i++ 而不需要像第一次运行时那样进行任何额外分配 - 它(本质上)是 i = i+1 的简写。

【讨论】:

    【解决方案2】:

    发生的事情是因为 java 是按值传递的。

    在第一个循环中,i 在 i++ 语句中递增,然而,在第二个循环中,i 被指向一个 new 内存位置存储 i 的值(在本例中为 0),然后递增旧位置。

    可视化:

    i => 0x00000001 // 0
    
    for() {
        i => 0x00000002 <- 0  // store old i value (0) in new location
        0x00000001++          // Increment the value stored at the old location
    
        // Cause there is no longer a reference to 0x00000001, 
        // it will get garbage collected and you will be left with
        // i => 0x00000002
    

    它将继续这样做,将旧值分配给新位置并为循环的每次传递增加旧值

    【讨论】:

      【解决方案3】:

      ++ 运算符在赋值之后处理,

      如果您更改它i=++i;,您可能会得到您期望的行为

      【讨论】:

      • 嗯,是的。但是你不应该推荐一个糟糕的解决方案。更好的解决方案是i++; 或i +=1; 或i = i + 1;。
      • 是的,同意,i=++i; 永远不会在实践中使用
      【解决方案4】:

      i=i++; 永远不会增加 i,因为 ++ 在 i=i 之后处理。

      你可以这样看:

      int i=0;
      for(int k=0;k<10;k++){
          int j = 0;
          i = j;
          j = j + 1;
      }
      

      【讨论】:

        【解决方案5】:

        看到这个绝妙的答案:

        x = x++;
        

        等价于

        int tmp = x;
        x++;
        x = tmp;
        

        来自this question。

        【讨论】:

        • 任何想了解x=x++ 的人请记住,后增量优先于赋值,x++ 增量但返回旧值。
        【解决方案6】:

        在第一个选项中,您使用 i++ 递增 i,相当于 i=i+1,因此它将 i 的值增加到 10。
        但在第二个选项中,您正在为 i 分配一个新值,因此每次都获得相同的值。

        【讨论】:

          【解决方案7】:
          i = i++;
          

          等价于,

          int temp = i; // temp = 0
          i++; // i=1
          i = temp; // i = 0
          

          【讨论】:

            【解决方案8】:

            i=i++;

            返回 i 并递增。所以增量丢失了...看看这个伪代码

            x = i++ 将在以下步骤中中断操作

            x = i;
            i++;
            

            在您的情况下,它将 0 增量返回到 1(但增量丢失)

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2011-01-24
              • 2011-05-14
              • 2015-07-05
              • 1970-01-01
              • 2017-05-17
              • 1970-01-01
              • 2011-01-19
              相关资源
              最近更新 更多