Java中的前置和后置增量
我只是想创建一个小小的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); 这将从左到右进行计算(请参阅) 第一
公共类测试{
公共静态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;