Java预增量和后增量运算符

Java预增量和后增量运算符,java,increment,Java,Increment,输出 2. 3. 四, 昨天我的朋友问了这个问题。我对此有点困惑。第1部分将i值打印为2。“增量后”在这里不起作用。但在第二部分中,它是有效的。我能理解第二部分,但我在第一部分中弄错了。它实际上是如何工作的?有人能让我明白吗?第一部分应该打印i=2。这是因为: public class Sample { public static void main(String[] args) throws Exception { //part 1 int

输出 2. 3. 四,

昨天我的朋友问了这个问题。我对此有点困惑。第1部分将i值打印为2。“增量后”在这里不起作用。但在第二部分中,它是有效的。我能理解第二部分,但我在第一部分中弄错了。它实际上是如何工作的?有人能让我明白吗?

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

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);
    }
}
也许理解这一点最简单的方法是引入一些额外的变量。以下是您所拥有的:

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);
    }
}
请注意,在增量之前或之后设置temp变量的顺序不同,这取决于它是增量后i++还是增量前i++。

i=i++的工作方式与您期望的工作方式不同,原因是增量后使用它的方式是这样的:

得到i的值 将步骤i中复制的原始文件逐个递增。 将新的i值设置为原始值。 那么我仍然是Java中的i


阅读Java中的and运算符。

好的,我想您已经理解了第二部分和第一部分中的混淆

   //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++)
检查上面的例子,你可以很容易地理解这里发生了什么

按照你的代码

++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)
那么i的值就是1

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

first i=i++;
然后它将增加1,现在我将是2

then next setp i=++i;
然后我的值保持不变,即2!//如果最后一步是i=++i;然后结果将是3

找到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 )

你是在问java、C++还是C++?@ ValkCalp真心我不完全确定这是问题。问题是用java语言编写的。是吗?@Kumar很可能是因为你的问题涉及到帖子和预增量/减量,这是一个覆盖范围极广的话题,尽管我投了反对票。@Kumar好吧,我很惊讶这没有被标记为重复。通常,如果有人这样想,他们会提出一个基本上代表同一个问题的问题。但在回答你的问题时,是的,你应该尽量避免问那些可以通过相对简单的搜索来回答的问题。你不太可能找到与你的问题完全匹配的答案,但这并不意味着你无法从前面的问题/答案中找出答案。为什么第一条语句中的i++在下一行中没有递增?在语句之后,它肯定会递增到2,但在你的语句中,问题是i=++i;语句i将首先返回,所以i的值将再次为2。您能更详细地解释它在内存中的存储方式以及它是如何处理的吗?我从您的示例中理解了它,并添加了额外的变量。谢谢
next step again 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 )
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);
}