【问题标题】:Precedence of arithmetic operators in JavaJava中算术运算符的优先级
【发布时间】:2015-08-29 15:15:00
【问题描述】:

我正在阅读《Java Deitel & Deitel 7th Edition 中的编程》,我看到了运算符的优先级,但我有些害怕。

作者说,当有一个数学典型表达式,其中有相等优先级的运算符时,运算从左到右运行。例如:

System.out.println (a + b + c - d);

从这个意义上说,操作是从左到右执行的,然后我在互联网上研究,我发现“=”运算符是从右到左运行的。例如:

int x;
x = 4 * 4 * 4% 2;

在我进一步调查并编写代码之前,所有税收都很好,我突然想到,我写了这个例外:

System.out.println ((4 * 4) + (8 * 8) * (4 * 4) - 16/4);

我的问题是,如果书中说加法和减法的优先级低于其他运算符,如果我将典型表达式的值相加怎么办?让我解释一下:

当我输入(4 * 4) + (8 * 8) * (4 * 4)时,我是把乘法的值加起来,然后降低运算符的优先级?

另一个问题:

如果我有一个例子如下:

System.out.println (a * b * c + d + e + f * g / h);

由于较高优先级的操作是从左到右执行的,所以当我有时间运行较高优先级时,它是否也从左到右运行?

给变量赋值时,优先级高的运算符是从右到左关联的吗?

【问题讨论】:

  • 我不明白你在问什么。你问(4 * 4) + (8 * 8) * (4 * 4) - 16/4的结果应该是什么?为什么不测试一下?
  • 数学运算符遵循 BEDMAS。同等优先级(如 +- 或 */)从左到右计算。 (4 * 4) + (8 * 8) * (4 * 4) 将是 (4 * 4) + [ (8 * 8) * (4 * 4) ] [] 发生在第一个 4*4 之后但在 + 之前
  • 很抱歉这么说,不过你好像是通过机械翻译提出的问题,真的很难理解你在问什么。
  • 我用谷歌翻译器
  • 不幸的是,我认为谷歌翻译做得不是很好。例如,我认为它在 exeption 中添加了您实际上是指 expression 的位置,但即使作为母语人士,我也无法猜测其中的某些含义,因此可能可以对你潜在的困惑没有帮助

标签: java variables operators


【解决方案1】:

我会尝试用一些参考资料来回答这个问题,这样你就可以进入任何你想要的深度。不完全清楚是什么让您感到困惑。

首先,您需要清楚赋值运算符(在您的示例中为=,但这些也包括例如+= 等)和其他(二进制)运算符(例如+-*,% 等)。赋值运算符(例如=)从右到左求值 - 即它们计算出运算符右侧的所有值,然后然后将其分配给左侧的任何值。

对于其他运算符,它们首先应用运算符优先级,然后对具有相同优先级的运算符应用从左到右的运算。 the official tutorial 中提供了优先级和讨论表。它与您正在使用的书的第 1509 页上的表格(图 A.1)非常相似,但网络教程的解释可能更容易理解。它可以概括为优先应用为括号中的表达式,然后是后缀,然后是一元运算符(例如x++,然后是-x),然后是乘法运算符(*\%)和然后是加法(+,-),最后是许多与这个问题不直接相关的逻辑运算符。

最后,教程包含语句

当相同优先级的运算符出现在同一个表达式中时,必须有一条规则来控制首先计算的值。除了赋值运算符之外的所有二元运算符都是从左到右计算的;赋值运算符从右到左求值。

至关重要的是,将重复从左到右评估的优先级,最容易通过逐步浏览示例来说明:

(4 * 4) + (8 * 8) * (4 * 4) - 16/4
// Found brackets - highest precedence.
// more than one, so evaluate left to right
16 + (8 * 8) * (4 * 4) - 16/4
16 + 64 * (4 * 4) - 16/4
16 + 64 * 16 - 16/4
//brackets finished, back to precedence.  Found multiplicative operators
//evaluate left to right
16 + 1024 - 16/4
16 + 1024 - 4
//multiplicative finished, back to precedence.  Found additive operators
//evaluate left to right
1040 - 4
1036
// Expression fully evaluated. Can now be used / assigned to a variable

附录

表达式求值的最终规范在Java Language Specification chapter 15 中。在这个级别上,它可能比有用更令人困惑,但为了完整起见,我将其包括在内。 Section 15.7.3 处理表达式和运算符优先级周围的括号(括号)。

【讨论】:

    【解决方案2】:

    通常,代码总是从左到右读取,但也遵循数学优先级。示例:

    (4 * 4) + (8 * 8) * (4 * 4) - 16/4
    

    在这种情况下,数学表示:先加括号,然后是乘法和除法,然后是加法和减法。那么:

    //Parenthesis done
    (16) + (64) * (16) - 16/4
    
    //Multiplication and division done
    16 + 1024 - 4
    
    //Addition and subtraction done
    1036
    

    【讨论】:

      猜你喜欢
      • 2014-06-03
      • 1970-01-01
      • 2019-06-06
      • 2012-12-13
      • 2021-10-25
      • 2011-12-28
      • 1970-01-01
      • 2011-09-16
      相关资源
      最近更新 更多