当我偶然发现i++
时,我正在弄乱i+++[another expression]
。我去DrJava进行了测试:
> int i;
> i++
0
> i+++1
2
> i+++1
3
> i+++2
5
> i+++1
5
> ++i+1
7
> ++i+1
8
> ++i+1
9
> ++i+2
11
后来,我这样做了:
> int i;
> i+++(++i);
> System.out.print(i);
2
> System.out.print(i);
2
> i+++(++i);
> System.out.print(i);
4
> i+++(++i);
> System.out.print(i);
6
我得出结论,返回的值是添加了i ++和另一个变量。但是我的+++(++ i)怎么样?那里发生了什么?最重要的是,为什么我想(或不想)在我的代码中使用它?
答案 0 :(得分:3)
i+++(++i)
我们可以将其重写为
(i++) + (++i)
请注意,i++
会增加i
并返回i
的初始值,而++i
会增加i
并返回{ {1}}的新值。
因此,对于i
,i = 3
将i++
增加到i
并返回4
。 3
然后将++i
增加到i
并返回5
。因此,结果是5
。 8
的最终值为i
,因为它增加了两倍:
5
8 5
有时将其视为bytecode:
会很有帮助int i = 3;
System.out.println(i+++(++i));
System.out.println(i);
最重要的是,为什么我想(或不想)在我的代码中使用它?
从不在您自己的代码中做这样的事情。将其分解为更小,可理解的部分,而不是在一条线上完成所有操作。
答案 1 :(得分:2)
您永远不会想在代码中使用它。它是如此令人困惑和混淆,你必须来这里询问它。你对人类同理心的感觉应该让你得出这样的结论:你不会让另外一个开发者感觉良好。
至于i+++(++i)
的方式,它会分解为(i++) + (++i)
。如果i
从零开始,则评估为:
i++
i变为1,此值为0. ++i
我变为2,此评估为2。0 + 2
评估为2(未在输出中显示),我是2。现在i
是2:
i++
我变为3,此评估为2。++i
我变为4,评估为4。2 + 4
评估为6(未在输出中显示),我是4。如果i
是4:
i++
我变为5,此评估为4。++i
我变为6,评估为6。4 + 6
评估为10(未在输出中显示),我是6。现在i
是6:
i++
我变为7,评估为6。++i
我变为8,评估为8。6 + 8
评估为14(未在输出中显示),我是6。值得注意的是a + b;
不是一个有效的Java语句,但是Java博士无论如何都要对它进行评估并打印结果(看起来你在第二个片段中删除了它)。然而,副作用是我每次增加两次(首先是i++
然后增加++i
),正如您可以通过上面派生的i看到的那样。
对于i+++N
,分解类似:这是(i++) + N
。假设i
为0而N
为3:
i++
i变为1,此值为0. 0 + 3
评估为3,i为1(未在输出中显示)。现在i
是1:
i++
我变为2,此评估为1. 1 + 3
评估为4,我是2(未在输出中显示)。等等。每次i
增加1,表达式作为一个整体评估为i
加上N
的上一个值。
答案 2 :(得分:2)
i+++(++i)
可以重写为(i++) + (++i)
换句话说,它是增加了i的前后增量。
然而,它是如此令人困惑和奇怪,永远不应该使用它。只需使用i += 2
代替。
答案 3 :(得分:0)
让我们简化
int x = 0;
x++ // now 1
then
x+++1 -> (x++) + 1 -> 2
答案 4 :(得分:0)
i+++1
=> i++
帖子增量+1
添加一个,这意味着:返回i + 1然后递增i。
i++++x
=> i++
帖子增量,++x
预增量x ==> (i++)+(++x)
==>递增x,将其添加到i并在返回结果增量后i。