【问题标题】:Java preincrement and postincrement operatorsJava 前置和后置运算符
【发布时间】:2014-11-04 05:18:48
【问题描述】:
public class Sample 
{
    public static void main(String[] args) throws Exception 
    {
        //part 1
        int i=1;
        i=i++;
        i=++i;
        i=i++;
        System.out.println(i);

        //part 2
        i=1;
        int a=i++;
        a=++i;
        a=i++;
        System.out.println(a+"\n"+i);
    }
}

输出
2
3
4

昨天我的朋友问了这个问题。我对此有点困惑。 第 1 部分i 值打印为 2。后增量在这里不起作用。但在第 2 部分中,它起作用了。我可以理解第 2 部分,但我对 第 1 部分感到困惑。它实际上是如何工作的?谁能让我明白?

【问题讨论】:

  • 您问的是 Java、C 还是 C++?
  • @ValekHalfHeart 我不完全确定这很重要。
  • 问题在JAVA。是吗?
  • @Kumar 很可能是因为您的问题涉及 post 和 pre 递增/递减,这是一个被广泛讨论的话题(尽管我投了反对票)。
  • @Kumar 好吧,我很惊讶这没有被标记为重复。通常,如果有人这么认为,他们会提出一个基本上代表相同问题的问题。但是在回答您的问题时,是的,您应该尽量避免提出可以通过相对简单的搜索来回答的问题。您不太可能找到与您的问题完全匹配的内容,但这并不意味着您无法从之前的问题/答案中找出答案。

标签: java increment


【解决方案1】:

第一部分应该打印i = 2。这是因为:

public class Sample 
{
    public static void main(String[] args) throws Exception 
    {
        //part 1
        int i=1;
        // i++ means i is returned (which is i = 1), then incremented, 
        //  therefore i = 1 because i is incremented to 2, but then reset 
        //  to 1 (i's initial value)
        i=i++;
        // i is incremented, then returned, therefore i = 2
        i=++i;
        // again, first i is returned, then incremented, therefore i = 2 
        //  (see first statement)
        i=i++;
        System.out.println(i);

        //part 2
        i=1;
        // first i is returned then incremented, so i = 2, a = 1
        int a=i++;
        // i is incremented then returned, so i = 3 and a = 3
        a=++i;
        // i is first returned, then incremented, so a = 3 and i = 4
        a=i++;
        System.out.println(a+"\n"+i);
    }
}

也许理解这一点最简单的方法是引入一些额外的变量。这是你所拥有的:

// i = i++
temp = i;
i = i + 1;
i = temp; // so i equals the initial value of i (not the incremented value)

// i = ++i;
i = i + 1;
temp = i;
i = temp; // which is i + 1

// i = i++
temp = i;
i = i + 1;
i = temp; // so i equals the previous value of i (not i + 1)

注意设置temp 变量的顺序不同——之前之后增量取决于它是否是后增量( i++) 或预增量 (++i)。

【讨论】:

  • 我从你的例子中理解了它的额外变量。谢谢
【解决方案2】:

i = i++ 没有按您期望的方式工作的原因是因为后增量(您使用它的方式)是这样工作的:

  1. 获取i的值
  2. 将原始(在步骤一中复制)i 加一。
  3. 将新的i 值设置为原始值。

那么i 仍然是i

【讨论】:

    【解决方案3】:

    Java

       //part 1
        int i = 1;
        i = i++; // i is still 1 since increment will rest by the assignment.
        i = ++i; // i+1=2 (since prefix increment)
        i = i++; // i is still 2
        System.out.println(i); // out put 2
    
        //part 2
        i = 1;
        int a = i++; // a is 1
        a = ++i; //a=1+2(since i++ now i is 2)=3
        a = i++;// a still 3
        System.out.println(a + "\n" + i); // now a is 3 is 4(since i++)
    

    Java 中读取prefixpostfix 运算符。

    【讨论】:

    • 你能更详细地解释一下它是如何存储在内存中的以及它是如何处理的吗?
    【解决方案4】:

    找到i=i++的字节码

    2: iload_1  ; load to stack (local = 1, stack = 1)
    3: iinc          1, 1; increment local variable (local =2, stack = 1)
    6: istore_1 ; store value from stack to local variable (local = 1 )
    

    这里我们将旧值从堆栈存储到局部变量。还可以在下面的代码中找到 cmets 以查看所有值的变化。

    public static void main(String[] args) throws Exception 
    {
        //part 1
        int i=1;
        i=i++;// i=1 here i will be assigned with 1. increment will not affect
        i=++i;// i=2 
        i=i++;// i=2
        System.out.println(i);
    
        //part 2
        i=1;
        int a=i++;// a=1, i=2
        a=++i;// a=3, i= 3
        a=i++;// a=3, i=4
        System.out.println(a+"\n"+i);
    }
    

    【讨论】:

      【解决方案5】:

      好的,我想你已经理解了第二部分和第一部分的困惑

      ++i will increment the value of i, and then return the incremented value.
      
       i = 1;
       j = ++i;
       here -->i is 2, j is 2
      i++ will increment the value of i, but return the original value that i held before being incremented.
      
       i = 1;
       j = i++;
       here -->i is 2, j is 1)
      

      查看上面的例子,你可以很容易理解这里发生了什么......

      根据你的代码

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

      那么 i 的值为 1

      then next setp i=++i;
      

      那么它将增加 1,现在 i 将是 2

      next step again i=i++;
      

      那么 i 值也保持不变,即 2 ! // 如果最后一步是 i=++i;那么结果将是 3

      【讨论】:

      • 为什么第一条语句中的 i++ 在下一行没有递增?
      • 在声明之后肯定会增加到 2 但在你的问题是 i=++i;声明 i 将首先返回,因此 i 的值将再次为 2
      猜你喜欢
      • 2013-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-21
      • 2015-07-29
      • 1970-01-01
      • 2011-03-17
      • 2022-11-24
      相关资源
      最近更新 更多