首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当涉及一元运算符时,Java如何处理操作符的优先级?

当涉及一元运算符时,Java如何处理操作符的优先级?
EN

Stack Overflow用户
提问于 2022-10-24 08:37:03
回答 2查看 49关注 0票数 0

我在Java中有以下代码:

代码语言:javascript
复制
int a=5,b=10,c;
c = ++b * ++a - a++ ;
System.out.println(c);

现在引用Java操作符优先级表:-

表格

我们将首先评估后缀a++,然后是前缀++a和++b,这给我们提供了:

c= 11 *7-5= 72

但是这个答案是错误的,正确的答案是60,我在这里做什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-10-24 08:59:39

根据Java语言规范第15.7.1节的说法

在计算右操作数的任何部分之前,二进制运算符的左操作数似乎是完全计算的。

在表达式中,这适用于-运算符。这意味着在计算++b * ++a的任何部分之前都会对a++进行全面评估。

当计算++b * ++a时,副作用是a增加到6,++b * ++a值为66,因为使用前缀运算符,在计算中使用变量的“后操作”值,所以这是11 * 6

一旦计算了++b * ++a,就可以计算-操作的右手操作数。这是a++,它的计算值为6,但将a增加到7。

因此减法是66 - 6,它是60。

不幸的是,Oracle Java教程中的表误导了您,这意味着后缀运算符总是在前缀运算符之前进行评估。由于这一声明与Java语言规范相矛盾,我只能想象Oracle Java教程的作者实际上有不同的意图,但并没有很好地表达自己。

票数 2
EN

Stack Overflow用户

发布于 2022-10-24 08:48:35

++aa++的区别在于,首先它会增加a的值,然后使用它的结果作为下一个表达式的输入,而a++将使用a的值作为表达式的值,然后增加a。

乘法的优先级也高于加法/减运算。就你而言:

代码语言:javascript
复制
c = ++b * ++a - a++ ;
c = ((++10) * (++5)) - (a++)
c = (11 * 6) - (6++) // a's value is 6 because of increment.
c = 66 - 6 // A value will become 7 but 6 will be used.
c = 60
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74178490

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档