我在Java中有以下代码:
int a=5,b=10,c;
c = ++b * ++a - a++ ;
System.out.println(c);现在引用Java操作符优先级表:-
我们将首先评估后缀a++,然后是前缀++a和++b,这给我们提供了:
c= 11 *7-5= 72
但是这个答案是错误的,正确的答案是60,我在这里做什么?
发布于 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教程的作者实际上有不同的意图,但并没有很好地表达自己。
发布于 2022-10-24 08:48:35
++a和a++的区别在于,首先它会增加a的值,然后使用它的结果作为下一个表达式的输入,而a++将使用a的值作为表达式的值,然后增加a。
乘法的优先级也高于加法/减运算。就你而言:
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 = 60https://stackoverflow.com/questions/74178490
复制相似问题