来自http://leepoint.net/notes-java/data/expressions/precedence.html
的一个例子以下表达式
1 + 2 - 3 * 4 / 5
评估为
1 + 2 - 3 * 4 / 5
= (1 + 2) - ((3 * 4) / 5)
= 3 - (12/5)
= 3 - 2 The result of the integer division, 12/5, is 2 .
= 1
然后我看到http://www.roseindia.net/java/master-java/operator-precedence.shtml
的另一个例子以下表达式
4 + 5 * 6 / 3
评估为
4 + (5 * (6 / 3))
我对如何确定哪些将在*和/涉及时首先进行评估感到有些困惑。在上面的例子中,两者似乎都不同。
第一个示例是将3*5/5
评估为((3*4)/5)
而第二个例子是评估5*6/3 as (5*(6/3))
我知道*和/优先于+和 - 但是当表达式同时包含*和/时呢。还有为什么以上两个例子显示了不同的方法?其中一个错了吗?
public class ZiggyTest {
public static void main(String[] args) {
System.out.println(4 + (5 * (6 / 3)));
System.out.println(4 + ((5 * 6) / 3));
System.out.println(1 + 2 - (3 * (4 / 5)));
System.out.println(1 + 2 - ((3 * 4) / 5));
}
}
上述程序产生输出
14
14
3
1
如果第一个输出产生相同的输出,为什么最后两个输出不相同。
答案 0 :(得分:11)
我对如何决定在*和/涉及时首先评估哪个
感到有些困惑
这就是为什么我们有规格:)
Section 15.7是Java语言规范中处理评估顺序和section 15.17状态的部分:
运算符*,/和%称为乘法运算符。它们具有相同的优先级,并且在语法上是左关联的(它们从左到右分组)。
因此,只要有A op1 B op2 C
且op1
和op2
都是*
,/
或%
,就相当于
(A op1 B) op2 C
或者换句话说 - 第二个链接的文章在他们的例子中是完全错误的。这是一个证明它的例子:
int x = Integer.MAX_VALUE / 2;
System.out.println(x * 3 / 3);
System.out.println((x * 3) / 3);
System.out.println(x * (3 / 3));
输出:
-357913942
-357913942
1073741823
这表明乘法发生第一次(导致整数溢出)而不是除法(最终将乘以1)。
答案 1 :(得分:3)
你确定吗?
4 + (5 * 6) / 3
4 + 30 / 3
4 + 10
14
4 + 5 * (6 / 3)
4 + 5 * 2
4 + 10
14
它们产生相同的输出,因为添加括号不会改变结果。对于您的其他等式,括号实际上会改变结果。通过删除我求解的等式中的括号,结果的正确路径是第一个。
答案 2 :(得分:2)
第二个是错的。请参阅Jon Skeet's回答。乘法运算符从左到右进行评估。分组:
4 + 5 * 6 / 3
应该是
4 + ((5 * 6) / 3).
在这种情况下,错误的分组
4 + (5 * (6 / 3))
产生相同的答案。