Java中的运算符优先级

zig*_*ggy 5 java scjp operators

http://leepoint.net/notes-java/data/expressions/precedence.html的一个例子中

以下表达式

1 + 2 - 3 * 4 / 5
Run Code Online (Sandbox Code Playgroud)

被评估为

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
Run Code Online (Sandbox Code Playgroud)

然后我从http://www.roseindia.net/java/master-java/operator-precedence.shtml中看到了另一个例子

以下表达式

4 + 5 * 6 / 3
Run Code Online (Sandbox Code Playgroud)

被评估为

4 + (5 * (6 / 3))
Run Code Online (Sandbox Code Playgroud)

我有点困惑的是如何确定哪些将在*和/涉及时首先进行评估.在上面的例子中,两者似乎都不同.

第一个例子是评估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));  
    }  
 } 
Run Code Online (Sandbox Code Playgroud)

上面的程序产生输出

14
14
3
1
Run Code Online (Sandbox Code Playgroud)

如果第一个产生相同的输出,为什么最后两个输出不相同.

Jon*_*eet 11

我有点困惑的是如何确定哪些将在*和/涉及时首先进行评估

这就是为什么我们有规格:)

第15.7节是处理评估顺序的Java语言规范部分,第15.17节说明:

运算符*,/和%称为乘法运算符.它们具有相同的优先级,并且在语法上是左关联的(它们从左到右分组).

所以,每当有A op1 B op2 C无一不op1op2*,/或者%是等同于

(A op1 B) op2 C
Run Code Online (Sandbox Code Playgroud)

或者换句话说 - 第二个链接的文章在他们的例子中是完全错误的.这是一个证明它的例子:

int x = Integer.MAX_VALUE / 2;        
System.out.println(x * 3 / 3);
System.out.println((x * 3) / 3);
System.out.println(x * (3 / 3));
Run Code Online (Sandbox Code Playgroud)

输出:

-357913942
-357913942
1073741823
Run Code Online (Sandbox Code Playgroud)

这表明乘法首先发生(导致整数溢出)而不是除法(最终乘以1).