1

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

4

5 回答 5

3
i+++(++i)

我们可以将其重写为

(i++) + (++i)

请注意,i++递增i并返回i' 的初始值,而++i递增i并返回i' 的值。

因此,对于i = 3i++递增i4并返回3++i然后递增i5并返回5。因此,结果是8i最终值为5,因为它增加了两次:

int i = 3;

System.out.println(i+++(++i));
System.out.println(i);
8
5

有时将其视为字节码会有所帮助:

ILOAD 1       // load i
IINC 1 1      // increment i
IINC 1 1      // increment i
ILOAD 1       // load new i (i.e. initial i + 2)
IADD          // add top two values on stack: i and (i + 2)

最重要的是,为什么我想要(或不想)在我的代码中使用它?

永远不要在你自己的代码中做这样复杂的事情。将其分解成更小、更易于理解的部分,而不是在一条线上全部完成。

于 2013-11-06T00:27:41.497 回答
2

你永远不想在你的代码中使用它。它是如此令人困惑和困惑,以至于您不得不来这里询问它。你的人类同理心应该让你得出这样的结论:让另一个开发人员经历这件事会让你感觉不好。

至于怎么i+++(++i)分解成(i++) + (++i)。如果i从零开始,则评估为:

  • i++i 变为 1,其值为 0。
  • ++ii 变为 2,计算结果为 2。
  • 0 + 2计算结果为 2(未在您的输出中显示), i 为 2。

现在如果i是 2:

  • i++i 变为 3,计算结果为 2。
  • ++ii 变为 4,其计算结果为 4。
  • 2 + 4计算结果为 6(未显示在您的输出中),i 为 4。

如果i是 4:

  • i++i 变为 5,计算结果为 4。
  • ++ii 变为 6,计算结果为 6。
  • 4 + 6计算结果为 10(未显示在您的输出中),i 为 6。

现在i是6:

  • i++i 变为 7,计算结果为 6。
  • ++ii 变为 8,计算结果为 8。
  • 6 + 8计算结果为 14(未在您的输出中显示),i 为 6。

值得注意的是,这a + b;不是一个有效的 Java 语句,但 Java 博士无论如何都会评估它并打印结果(看起来你在第二个片段中删除了它)。但是,副作用是 i 每次递增两次(第一次i++++i),正如您从上面导出的 i 的值中看到的那样。

对于i+++N分解类似:这是(i++) + N. 说i是 0 和N是 3:

  • i++i 变为 1,其值为 0。
  • 0 + 3评估为 3,i 为 1(未显示在您的输出中)。

现在i是1:

  • i++i 变为 2,计算结果为 1。
  • 1 + 3计算结果为 4,i 为 2(未显示在您的输出中)。

等等。每次,i都增加 1,整个表达式的计算结果为iplus的前一个值N

于 2013-11-06T00:25:55.097 回答
2

i+++(++i)可以重写为(i++) + (++i)

换句话说,它是 i 的前后增量的加法。

然而,它是如此令人困惑和奇怪,以至于永远不应该使用它。改用就好i += 2了。

于 2013-11-06T00:28:05.090 回答
0

让我们简化

int x = 0;
x++ // now 1
then
x+++1 -> (x++) + 1 -> 2
于 2013-11-06T00:27:22.583 回答
0

i+++1=>i++后自增加+1一,所以它的意思是:返回 i+1,然后自增。

i++++x=>i++后增量,++x前增量 x ==> (i++)+(++x)==> 增量 x,将其添加到 i 并在返回结果后增量 i。

于 2013-11-06T00:27:48.497 回答