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变为1,计算结果为0i++
i变为2,计算结果为2++i
计算结果为2(未显示在输出中),i为20+2
i
为2:
i变为3,计算结果为2i++
i变为4,计算结果为4++i
计算为6(未显示在输出中),i为42+4
i
为4:
i变为5,计算结果为4i++
i变为6,计算结果为6++i
计算为10(未显示在输出中),i为64+6
i
是6:
i变为7,计算结果为6i++
i变为8,计算结果为8++i
计算为14(未显示在输出中),i为66+8
a+b
不是有效的Java语句,但Dr.Java无论如何都会对其进行计算并打印结果(看起来您在第二个代码段中删除了该结果)。但是,副作用是i每次递增两次(首先是由i++
递增,然后是由++i
递增),正如上面导出的i的值所示
对于i+++N
来说,分解是类似的:这是(i+++N
。假设i
为0,N
为3:
i变为1,计算结果为0i++
计算结果为3,i为1(未显示在输出中)0+3
i
是1:
i变为2,计算结果为1i++
计算结果为4,i为2(未显示在输出中)1+3
等等。每次,
i
递增1,表达式作为一个整体计算为前面的值i
加上N
您永远不希望在代码中使用此值。它是如此令人困惑和困惑,以至于你不得不来这里询问它。你的人类同理心应该让你得出这样的结论:让另一个开发人员经历这种情况,你会感觉不好
至于i++(++i)
,它是如何分解成(i++)+(++i)
。如果i
开始为零,则评估为:
i变为1,计算结果为0i++
i变为2,计算结果为2++i
计算结果为2(未显示在输出中),i为20+2
i
为2:
i变为3,计算结果为2i++
i变为4,计算结果为4++i
计算为6(未显示在输出中),i为42+4
i
为4:
i变为5,计算结果为4i++
i变为6,计算结果为6++i
计算为10(未显示在输出中),i为64+6
i
是6:
i变为7,计算结果为6i++
i变为8,计算结果为8++i
计算为14(未显示在输出中),i为66+8
a+b
不是有效的Java语句,但Dr.Java无论如何都会对其进行计算并打印结果(看起来您在第二个代码段中删除了该结果)。但是,副作用是i每次递增两次(首先是由i++
递增,然后是由++i
递增),正如上面导出的i的值所示
对于i+++N
来说,分解是类似的:这是(i+++N
。假设i
为0,N
为3:
i变为1,计算结果为0i++
计算结果为3,i为1(未显示在输出中)0+3
i
是1:
i变为2,计算结果为1i++
计算结果为4,i为2(未显示在输出中)1+3
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)