Java 谁能解释一下我+++;x?

Java 谁能解释一下我+++;x?,java,increment,drjava,Java,Increment,Drjava,当我无意中发现I++[另一个表达式]时,我正在与I++打交道。我用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 > Syst

当我无意中发现
I++[另一个表达式]
时,我正在与
I++
打交道。我用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)呢?那里发生了什么事?最重要的是,为什么我想(或不想)在我的代码中使用它?

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

至于
i++(++i)
,它是如何分解成
(i++)+(++i)
。如果
i
开始为零,则评估为:

  • i++
    i变为1,计算结果为0
  • ++i
    i变为2,计算结果为2
  • 0+2
    计算结果为2(未显示在输出中),i为2
现在,如果
i
为2:

  • i++
    i变为3,计算结果为2
  • ++i
    i变为4,计算结果为4
  • 2+4
    计算为6(未显示在输出中),i为4
如果
i
为4:

  • i++
    i变为5,计算结果为4
  • ++i
    i变为6,计算结果为6
  • 4+6
    计算为10(未显示在输出中),i为6
现在
i
是6:

  • i++
    i变为7,计算结果为6
  • ++i
    i变为8,计算结果为8
  • 6+8
    计算为14(未显示在输出中),i为6
值得注意的是,
a+b
不是有效的Java语句,但Dr.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,表达式作为一个整体计算为前面的值
i
加上
N

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

至于
i++(++i)
,它是如何分解成
(i++)+(++i)
。如果
i
开始为零,则评估为:

  • i++
    i变为1,计算结果为0
  • ++i
    i变为2,计算结果为2
  • 0+2
    计算结果为2(未显示在输出中),i为2
现在,如果
i
为2:

  • i++
    i变为3,计算结果为2
  • ++i
    i变为4,计算结果为4
  • 2+4
    计算为6(未显示在输出中),i为4
如果
i
为4:

  • i++
    i变为5,计算结果为4
  • ++i
    i变为6,计算结果为6
  • 4+6
    计算为10(未显示在输出中),i为6
现在
i
是6:

  • i++
    i变为7,计算结果为6
  • ++i
    i变为8,计算结果为8
  • 6+8
    计算为14(未显示在输出中),i为6
值得注意的是,
a+b
不是有效的Java语句,但Dr.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,表达式作为一个整体计算为前面的值
i
加上
N

int x = 0;
x++ // now 1
then
x+++1 -> (x++) + 1 -> 2
让我们简化

int x = 0;
x++ // now 1
then
x+++1 -> (x++) + 1 -> 2
我们可以把它改写为

(i++) + (++i)
请注意,
i++
增加
i
并返回
i
的初始值,而
++i
增加
i
并返回
i
的新值

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