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),然后再加2
i
已完成其引用,因此它将再添加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++
之间的关系。