当前位置: 首页 > 面试题库 >

Java中的运算符优先级

梁楷
2023-03-14
问题内容

在来自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

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


问题答案:

我对如何确定在涉及*和/时将首先评估哪个值感到有些困惑

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

第15.7节是Java语言规范中涉及评估顺序的部分,第15.17节指出:

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

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

(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)。



 类似资料:
  • 问题内容: 由于Java中运算符优先级的正确性,我感到困惑。我在教程很久以前读到并具有更高的优先级高于OR,这是在提供的答案确认问题。但是,我目前正在使用《 Sun Java 6认证程序员学习指南》学习Java。本书包含以下示例: 我复制并引用了有关编译器如何处理上述代码的解释: 是,然后是或结果 为,然后打印。由于存在短路,因此对表达式进行评估,好像周围有括号。换句话说,它被评估为之前的单个表达

  • 所有的数学运算都认为是从左向右运算的, Java 语言中大部分运算符也是从左向右结合的,只有单目运算符、赋值运算符和三目运算符例外,其中,单目运算符、赋值运算符和三目运算符是从右向左结合的,也就是从右向左运算。 乘法和加法是两个可结合的运算,也就是说,这两个运算符左右两边的操作数可以互换位置而不会影响结果。运算符有不同的优先级,所谓优先级就是在表达式运算中的运算顺序。 一般而言,单目运算符优先级较

  • 为什么JVM不遵守它自己的规则。以下面的例子为例。 结果是: 而实际结果应该是,根据&运算符是在运算符之前求值的事实: 对于为什么没有正确实现这一点,有一些解释会很好。即使在第二部分周围添加括号,也没有使用正确的优先级。

  • 从高到低顺序如下: ^ not - (一元运算) * / + - ..(字符串连接) < > <= >= ~= == and or

  • 优先级从上到下依次递减,最上面具有最高的优先级,逗号操作符具有最低的优先级。 相同优先级中,按结合顺序计算。大多数运算是从左至右计算,只有三个优先级是从右至左结合的,它们是单目运算符、条件运算符、赋值运算符。 基本的优先级需要记住: 指针最优,单目运算优于双目运算。如正负号。 先乘除(模),后加减。 先算术运算,后移位运算,最后位运算。请特别注意:1 << 3 + 2 & 7等价于 (1 << (

  • EL中的运算符都有不同的运算优先级,表7.5列出了EL中的运算符的优先级,上一行运算符的优先级要高于后一行的优先级。对于同一行的运算符,按着运算符在表达式中出现的顺序从左到右依次计算。 表7.5 运算符的优先级 [] . () - (一元)  not  !  empty *  /  div  %  mod +  - (二元) <  >  <=  >=  lt  gt  le  ge ==  !=