Java 一元操作的优先级
下面是一个输出Java 一元操作的优先级,java,Java,下面是一个输出6的示例: public static void main(String[] args) { int i = 1; m(++i); } static void m(int i) { i = ++i + i++; System.out.println(i); } 我们得到了6,因为在m(inti)方法中,首先对3和3进行了汇总,然后i变成了4(由于i++),但在这之后,左侧的i取了汇总的6值 但是如果将方法更改为以下内容,我们将得到7: stat
6
的示例:
public static void main(String[] args) {
int i = 1;
m(++i);
}
static void m(int i) {
i = ++i + i++;
System.out.println(i);
}
我们得到了6
,因为在m(inti)
方法中,首先对3
和3
进行了汇总,然后i
变成了4
(由于i++
),但在这之后,左侧的i
取了汇总的6
值
但是如果将方法更改为以下内容,我们将得到7
:
static void m(int i) {
i = ++i + ++i;
System.out.println(i);
}
但我希望在这两种情况下都能看到
7
(我一直受到一元操作的指导,在本例中,一元操作的优先级高于二元操作)。请有人对第一个示例中被忽略的i++
提供解释(或对解释的引用)+i
增量i
并返回i
的新值
i++
递增i
并返回i
的旧值
表达式从左到右求值,并考虑运算符优先级
所以在++i+i++
中,当你从i==2开始时,你会得到:++i
,它将i
增加到3
,并返回3
;然后i++
它将i
递增到4
并返回3
。最后你得到了i=3+3
,所以i
变成了6
请注意,这些都是与现实编程无关的有趣技巧。增量不会被忽略;它是一个后加运算符(即,在引用了i
之后应用)。让我们浏览一下代码
当您添加(++i+i++)
时,它是从左到右进行的。也就是说,无论我有什么值,都会先预加(所以需要2到3),然后再加2i
已完成其引用,因此它将再添加1,总共6个
在第二个示例中,当您添加(++i+++i)
时,i
的值预加两次,因此您将看到3+4
请有人对第一个示例中被忽略的i++
进行解释(或引用解释)好吗
i++
是后增量;它递增i
,但从递增之前计算为i
的值。例如:
int i = 3;
System.out.println(i++); // prints 3
// now, i == 4
i = ++i + i++;
换句话说,你可以把i++
看作是((i+=1)-1)
的意思。因此,在您的示例中:
int i = 3;
System.out.println(i++); // prints 3
// now, i == 4
i = ++i + i++;
最后的i++
并没有被完全忽略-它确实是递增的i
-但它立即被赋值所取代。递增运算符从左到右运行,i++
在递增之前返回结果,i。e++我把i设为6,然后计算i+i,然后i++再增加一次。i+++++i
也会显示2+4=6,i+++i++
最后是2+3=5,但并非最不重要的是,i=i++
没有效果,因为它会在增加回i之前分配值:)我编辑了你的答案,将“postfix”改为“postincrement”,我想这就是你的意思;但后来我取消了编辑,因为这真的取决于你。但我认为你想要“后增长”。(“后缀”只与它的物理位置有关,而与它的应用时间无关。)我对它很满意;我很高兴你听到了。这正是我的意思。谢谢谢谢,在现实世界的编程中没有这样的案例是有希望的。我不完全同意你的最后一段。像++i+i++
这样的怪事与现实世界的编程无关,但OP似乎没有意识到++i
和i++
之间的差异,而这种差异与现实世界的编程有关。@ruakh的确,++i
和i++
之间的差异非常重要。我的意思是,你不应该在真正的软件中编写像I=++I+I++
这样复杂、难以理解的语句。@ruakh好吧,你是对的,但问题并不在于++I
和I++
之间的区别(如您所见,我在问题的第一个代码示例中描述了发生的事情的过程)。我想清楚地了解在第一个描述的案例中=
和I++
之间的关系。