【问题标题】:Java order of operations clarificationJava 操作顺序说明
【发布时间】:2021-06-05 17:18:51
【问题描述】:

我无法理解 Java 中的操作顺序。算术运算符不是在关系之前评估的。如果是这样,为什么这段代码运行没有错误?不应该先计算 y/z,导致算术异常。

public static void main(String[] args) {
        // TODO Auto-generated method stub
    int x = 10;
    int y = 20;
    int z = 0;
    
    if(x>y && 10 < y/z) {
        System.out.print("Homer");
    }
    
    }

【问题讨论】:

  • This 应该会有所帮助。
  • 运算符优先级和运算顺序是两个不同的东西。

标签: java operator-precedence


【解决方案1】:

正如 Sotirios Delimanolis 所提到的,我对操作顺序/顺序优先级的定义以及何时以及如何使用它感到困惑。

顺序优先发挥作用的唯一时间是两个运算符共享一个操作数。例如,1 > 2 + 3 被视为 1 > (2 + 3),而 (1 > 2 && 1 > (2 + 3))) 不共享操作数,因此表达式按顺序执行。一旦进入共享操作数的表达式,计算机就会利用运算顺序来确定首先计算哪个运算。

一种简单的思考方式是:在一个表达式中,您可能有由连接运算符连接的子表达式,例如 &&、||、&、|、^。这些子表达式按顺序计算,但是在子表达式中,您必须使用顺序优先级来计算先执行哪个运算符。

【讨论】:

    【解决方案2】:

    && 运算符短路:即:如果第一次检查失败,它不会打扰进行第二次检查。现在,如果 X 实际上大于 Y,则在执行第二次检查时会出现除以 0 异常。

    出于好奇,我尝试直接输入 10/0,但它仍然按顺序评估条件。我想这是有道理的,因为您不希望进行任何已经预先确定为错误的实际计算。这只是浪费时间。

    【讨论】:

    • 是的,我看到它短路了,但为什么 x>y 在 y/z 之前评估。根据 Java 的运算顺序,算术运算符的优先级是否高于关系运算符。据我了解,x>y 甚至不应该在 y/z 之前进行评估
    猜你喜欢
    • 2012-07-19
    • 1970-01-01
    • 2017-11-07
    • 1970-01-01
    • 2015-07-07
    • 2018-07-22
    • 1970-01-01
    • 2021-10-25
    • 1970-01-01
    相关资源
    最近更新 更多