有人可以解释i +++ x吗?

时间:2013-11-06 00:23:22

标签: java increment drjava

当我偶然发现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)怎么样?那里发生了什么?最重要的是,为什么我想(或不想)在我的代码中使用它?

5 个答案:

答案 0 :(得分:3)

i+++(++i)

我们可以将其重写为

(i++) + (++i)

请注意,i++会增加i并返回i初始值,而++i会增加i并返回{ {1}}的值。

因此,对于ii = 3i++增加到i并返回43然后将++i增加到i并返回5。因此,结果是58的最终值为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。