数学表达式的正确优先级是什么

2022-09-03 18:21:27

在Java中,此表达式中的数学运算的正确顺序是什么:

    a + b  * c / ( d - e )
1.    4    1   3     2
2.    4    2   3     1

我知道两个答案的结果都是一样的。但我想完全理解java编译器的逻辑。在此示例中首先执行什么 - 乘法还是括号中的表达式?指向涵盖以下内容的文档的链接会很有帮助。

更新:谢谢你们的答案。你们大多数人都写括号中的表达式首先被计算。在查看了Grodriguez提供的参考资料后,我创建了一些测试:

int i = 2;
System.out.println(i * (i=3)); // prints '6'
int j = 2;
System.out.println((j=3) * j); // prints '9'

谁能解释为什么这些测试会产生不同的结果?如果第一个计算括号中的表达式,我会期望相同的结果 - 9。


答案 1

到目前为止,几乎每个人都将评估顺序与运算符优先级混淆。在 Java 中,优先规则使表达式等效于以下内容:

a + (b  * c) / ( d - e )

因为 和 具有相同的优先级,并且保持关联。*/

评估的顺序严格定义为首先是左手操作数,然后是右操作数,然后是操作(||和 &&除外)。所以评估的顺序是:

  a
      b
      c
    *
      d
      e
    -
  /
+

评估顺序在页面中向下排列。缩进反映了语法树的结构

编辑

回应格罗德里盖兹的评论。以下程序:

public class Precedence 
{
    private static int a()
    {
        System.out.println("a");
        return 1;
    }   
    private static int b()
    {
        System.out.println("b");
        return 2;
    }
    private static int c()
    {
        System.out.println("c");
        return 3;
    }
    private static int d()
    {
        System.out.println("d");
        return 4;
    }
    private static int e()
    {
        System.out.println("e");
        return 5;
    }

    public static void main(String[] args) 
    {
        int x = a() + b() * c() / (d() - e());
        System.out.println(x);
    } 
}

生成输出

a
b
c
d
e
-5

这清楚地表明乘法是在减法之前执行的。


答案 2

正如JeremyP很好地向我们展示的那样,第一个答案是正确的。

通常,以下规则适用:

  • 在执行操作本身之前,将计算运算符的每个操作数(、 和||&&? :)
  • 操作数从左到右计算。在计算右操作数的任何部分之前,二元运算符的左侧操作数似乎已完全计算完毕。
  • 求值顺序遵循括号和运算符优先级:
    • 首先计算括号。
    • 运算符按优先级顺序计算。
    • 具有相等优先级的运算符从左到右计算,但赋值运算符从右到左计算的除外。

请注意,前两条规则解释了第二个问题中的结果:

int i = 2;
System.out.println(i * (i=3)); // prints '6'
int j = 2;
System.out.println((j=3) * j); // prints '9'

参考文档:

http://java.sun.com/docs/books/jls/second_edition/html/expressions.doc.html#4779

教程:

http://download.oracle.com/javase/tutorial/java/nutsandbolts/operators.html