【问题标题】:unable to make out this assignment in java无法在 java 中完成这个任务
【发布时间】:2010-03-04 05:47:31
【问题描述】:

谁能解释一下为什么会这样

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

它打印为零。

【问题讨论】:

    标签: java


    【解决方案1】:

    i++ 是一个后增量 (JLS 15.14.2)。它递增i,但表达式的结果是i 的值之前 递增。将此值重新分配给i 实际上使i 的值保持不变。

    这样分解:

    int i = 0;
    int j = i++;
    

    很容易看出为什么j == 0 在这种情况下。现在,我们用i 替换左侧而不是j。右手边的值仍然是0,这就是为什么你会在你的sn-p中得到i == 0

    【讨论】:

      【解决方案2】:

      你的本意是这样做的:

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

      i++ 实际上做了一个分配,所以如果你添加一个= 你只会混淆事情。这些其他优秀的响应者可以为您提供细节,其中一些细节让我无法理解。 :)

      【讨论】:

        【解决方案3】:

        首先你不应该写这种代码......

        但是,如果我们考虑问题,那么这很简单:它与后缀运算符“返回”值的方式有关。后缀优先于赋值运算符,但后缀运算符在增加 i 的值后返回 i 的前一个值。所以我再次被分配到它之前的值。

        再一次不要在你的代码中使用这个结构,因为下一个看到这个结构的程序员会追上你(手里拿着大东西):)

        【讨论】:

          【解决方案4】:

          I=++ 增加,A=i 分配。它们是不可交换的:IA != AI

          总结

          IA = "first increase then assignment"

          AI="first assignment then increase"

          反例

          $ javac Increment.java 
          $ java Increment 
          3
          $ cat Increment.java 
          import java.util.*;
          import java.io.*;
          
          public class Increment {
              public static void main(String[] args) {
                  int i=0;
                  i=++i;
                  i=++i;
                  i=++i;
                  System.out.println(i);
              }
          }
          

          相关

          【讨论】:

            猜你喜欢
            • 2022-01-02
            • 2016-08-27
            • 1970-01-01
            • 1970-01-01
            • 2023-03-10
            • 1970-01-01
            • 2012-01-17
            • 2011-07-31
            • 1970-01-01
            相关资源
            最近更新 更多