What is the right precedence of the math expressio

2020-08-09 17:13发布

What is the correct sequence of the math operations in this expression in Java:

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

I understand that result is the same in both answers. But I would like to fully understand the java compiler logic. What is executed first in this example - multiplication or the expression in parentheses? A link to the documentation that covers that would be helpful.

UPDATE: Thank you guys for the answers. Most of you write that the expression in parentheses is evaluated first. After looking at the references provided by Grodriguez I created little tests:

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

Could anybody explain why these tests produce different results? If the expression in parentheses is evaluated the first I would expect the same result - 9.

8条回答
兄弟一词,经得起流年.
2楼-- · 2020-08-09 17:46

i am assuming that your expression would be something like

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

the equality operator has right to left order of evaluation. so the expression on the right of = will be evaluated first.

if your refer this precedence chart: http://www.java-tips.org/java-se-tips/java.lang/what-is-java-operator-precedence.html

1) the brackets will be evaluated (d-e), lets say (d - e) = f so the expression then becomes x = a + b * c / f.

2) Now * and / have same precedence, but the order of evaluation is left to right to * will be evaluated first so lets say b * c = g, so the expression becomes x = a + g /f

3) Now / has the next precedence so g / f will be evaluated to lets say h so the expression will be come x = a + h,

4) lastly evaluating a + h

查看更多
劫难
3楼-- · 2020-08-09 17:47

The results of the calculation are defined by the Operator Order of Precedence. So parentheses have highest precedence here, multiplication and division next highest, and addition and subtraction lowest. Operators with equal precedence are evaluated left to right. So the expression in the question is equivalent to:

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

However there is a slight difference between what is normally meant by "being evaluated first" and the operator precedence for getting the correct answer.

"d-e" is not necessarily actually calculated before "a" is calculated. This pretty much doesn't make any difference unless one of the 'variables' in the expression is actually a function. The Java standard does not specify the order of evaluation of components of an expression.

查看更多
仙女界的扛把子
4楼-- · 2020-08-09 17:48

As JeremyP has nicely shown us, the first answer is correct.

In general, the following rules apply:

  • Every operand of an operator is evaluated before the operation itself is performed (except for ||, &&, and ? :)
  • Operands are evaluated left to right. The left-hand operand of a binary operator appears to be fully evaluated before any part of the right-hand operand is evaluated.
  • The order of evaluation respects parentheses and operator precedence:
    • Parentheses are evaluated first.
    • Operators are evaluated in order of precedence.
    • Operators with equal precedence are evaluated left-to-right, except for assignment operators which are evaluated right-to-left.

Note that the first two rules explain the result in your second question:

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

Reference documentation:

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

Tutorial:

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

查看更多
放荡不羁爱自由
5楼-- · 2020-08-09 17:51

In your second question, it seems Java is evaluating the part in parenthesis as an assignment, not an mathematical expression. This means that is will not perform parenthetical assignments in the same order as operations in parenthesis.

查看更多
神经病院院长
6楼-- · 2020-08-09 17:55

It evaluates the expressions in the following order. Variable names are expressions that need to be evaluated.

a + b * c / (d - e)
    2   3    5   6
      4        7
1         8
  9

So, the answer to your question is #1. The order of operations determines the shape of the expression tree (what is the left side of the tree, and what is the right), but the left side is always evaluated first (and the root is evaluated last).

查看更多
beautiful°
7楼-- · 2020-08-09 17:57

Almost everybody so far has confused order of evaluation with operator precedence. In Java the precedence rules make the expression equivalent to the following:

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

because * and / have equal precedence and are left associative.

The order of evaluation is strictly defined as left hand operand first, then right, then operation (except for || and &&). So the order of evaluation is:

  a
      b
      c
    *
      d
      e
    -
  /
+

order of evaluation goes down the page. Indentation reflects the structure of the syntax tree

Edit

In response to Grodriguez's comments. The following program:

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);
    } 
}

Produces the output

a
b
c
d
e
-5

which clearly shows the multiplication is performed before the subtraction.

查看更多
登录 后发表回答