Java中的前置和后置增量

Java中的前置和后置增量,java,Java,我只是想创建一个小小的Java拼图,但我自己也很困惑。谜题的一部分是: 以下代码的作用是什么: 公共类测试{ 公共静态void main(字符串[]args){ int i=1; i++=+i+i+++++i; System.out.println(“i=“+i”); } } 它输出9 我(至少部分)的错误解释: 我不太确定,但我认为I+=之后的术语的计算如下: 所以 与 int i = 1; i += ((++i) + (i++)) + (++i); 这将从左到右进行计算(请参阅) 第一

我只是想创建一个小小的Java拼图,但我自己也很困惑。谜题的一部分是:

以下代码的作用是什么:

公共类测试{
公共静态void main(字符串[]args){
int i=1;
i++=+i+i+++++i;
System.out.println(“i=“+i”);
}
}
它输出
9

我(至少部分)的错误解释

我不太确定,但我认为
I+=
之后的术语的计算如下:

所以

int i = 1;
i += ((++i) + (i++)) + (++i);
这将从左到右进行计算(请参阅)

第一个
++i
i
增加到
2
,并返回
2
。所以你有:

i = 2;
i += (2 + (i++)) + (++i);
i++
返回
2
,因为它是
i
的新值,并将
i
增加到
3

i = 3;
i += (2 + 2) + ++i;
第二个
++i
递增
i
4
,并返回
4

i = 4;
i += (2 + 2) + 4;
所以你最终得到的是
12
,而不是
9


我解释的错误在哪里?正确的解释是什么?

关于正确的零件评估,您是对的,但是您缺少关于作业的一个细节

运行以下命令:

i = i++;
或者这个:

i += i++;
在两次操作之后,我仍然保留其原始值

那是因为在作业的右边之前,我在左边被评估


因此,在您的例子中,您将8添加到1,而不是4。

输出是9()

变成

i = 1 + 2 + 2 + 4

i++=+i+i+++i
i=i+++i+i+++i


从左到右计算右侧,得出
i=1+2+2+4(这会产生
i=9
)。

如果您想象java如何在寄存器中存储值,就很容易理解它是如何工作的!他把1放入第一个寄存器,然后通过=号,增加i(++i),所以现在在i中有2,在第二个寄存器中有2,但是第一个寄存器没有更新,在第三个寄存器中有2,然后我增加,然后我增加,在最后一个寄存器中有4。所以你会有这样的东西 1=2+2+4==9

int i = 1;
i += ++i + i++ + ++i
相当于

int tmp1 = i // 1, +=

i ++; // 2
int tmp2 = i; // 2

int tmp3 = i; // 2
i ++; // 3

i ++; // 4
int tmp4 = i; // 4

i = tmp1 + tmp2 + tmp3 + tmp4; // 9

i++=+i+i+++++++i

  • i=1
    开始时
  • i+=X
    ->
    i=i+X
    ->
    i=1+X
    (让我们来计算X)
  • ++i
    将增加到2,并且
    返回2
  • i++
    返回2
    ,然后递增为3
  • ++i
    将从3增加到4,
    返回4
  • X=2+2+4=8
  • 所以
    i=1+8
    ->
    i=9


    如果你的代码是这样的话,你会得到12分

    int i = 1;
    int tmp = ++i + i++ + ++i;  
    i += tmp;
    

    因为这样您的代码将是
    i=1
    ,在计算tmp之后,我将是
    i=4
    ,然后
    i+=tmp
    ->
    i=4+8=12

    您确定它输出8吗?因为对我来说它输出9。谢谢你的提示。它输出9。(8是其他难题之一)。然而,9不是12。因此我的想法是正确的,但
    i+=s
    被评估为
    i=i+s
    ,这并不等同于
    i=s+i
    ,其中
    s
    是一个语句。对的你有没有关于
    i+=a
    被计算为
    i=i+a
    的消息来源?@moose这一切都在Java语言规范中:@jsn谢谢你为我链接。这是个好问题。在这种情况下,如果您不知道规格说明或在哪里查找,则数学会变得非常模糊。干杯
    int tmp1 = i // 1, +=
    
    i ++; // 2
    int tmp2 = i; // 2
    
    int tmp3 = i; // 2
    i ++; // 3
    
    i ++; // 4
    int tmp4 = i; // 4
    
    i = tmp1 + tmp2 + tmp3 + tmp4; // 9
    
    int i = 1;
    int tmp = ++i + i++ + ++i;  
    i += tmp;