Java中的算术运算符(初学者问题)

Posted

技术标签:

【中文标题】Java中的算术运算符(初学者问题)【英文标题】:Arithmetic Operators in Java (Beginner Question) 【发布时间】:2011-07-17 07:47:10 【问题描述】:

我知道数组运算符具有优先级。然后是二元算术运算符 * 、 / 、 % 。然后是 + 和 - 它们的优先级较低。

但是我很困惑在这个例子中哪个是java首先解决的。 如果我们有 2 个运算符具有相同的优先级,那么 java 中首先使用哪个运算符?

谢谢。

int x = y = -2 + 5 * 7 - 7 / 2 % 5;

如果有人可以为我解决这个问题并逐步向我解释。因为这总是让我在考试中感到困惑。

【问题讨论】:

它基于 BODMAS 规则 - 括号外除法乘法加减法顺序。 如果您不确定运算符的优先级,那么只需添加额外的括号。它没有任何缺点,例如让您的代码变慢,并且在许多情况下使代码更具可读性。 非常感谢大家!软岩石!!!! 【参考方案1】:

如果运算符具有相同的优先级,则从左到右计算它们。

来自tutorial:

当具有相同优先级的运算符时 出现在同一个表达式中,一条规则 必须控制首先评估哪个。 所有二元运算符,除了 赋值运算符被评估 从左到右;任务 运算符从右到左求值。

在表达式7 / 2 % 5中,/%具有相同的优先级,所以从左到右7 / 2 = 33 % 5 = 3

最高优先级被赋予* / %。这是您的示例的细分:

  -2 + 5 * 7 - 7 / 2 % 5
= -2 + (5 * 7) - (7 / 2 % 5)
= -2 + 35 - (3 % 5)
= -2 + 35 - 3
= 30

【讨论】:

这正是我想知道的(从左到右!)我在 Fortran75 和 Java 之间感到困惑。泰!!【参考方案2】:

y 将被赋值为-2 + 5 * 7 - 7 / 2 % 5。然后x 将被分配y 的值。

算术表达式的计算方式如下:

-2 + (5 * 7) - ((7 / 2) % 5)

Here's Java 运算符优先级的解释。

【讨论】:

使用四格代码格式时,不要使用反引号【参考方案3】:

这看起来像您需要阅读的内容:Java Operators Tutorial。

阅读教程,然后为自己编写一个示例程序并尝试使用它,直到您对运算符优先级感到满意为止。这是最好的学习方式。

【讨论】:

【参考方案4】:
int x = y = -2 + 5 * 7 - 7 / 2 % 5;

相同
int x = y = (-2 + ((5 * 7) - ((7 / 2) % 5)));

/,* 和 %(乘法)具有相同的优先级,并且它们的关联是从左到右的。 + 和 -(加法)具有相同的优先级,并且它们的关联是从左到右的。 乘法运算的优先级高于加法运算。

【讨论】:

【参考方案5】:

不完全相关,但您可能会对此感兴趣。它与序列点有关,序列点是程序中的点,本质上是编译器确保一切同步的点。它出现在 SO 上是因为问题是什么

x = x++; // Operator prcedence and/or sequence point problem;

做吗?或者更糟

x[i]=i++ + 1;// sequence point problem

Why does this go into an infinite loop?

http://www.angelikalanger.com/Articles/VSJ/SequencePoints/SequencePoints.html

【讨论】:

在 Java 中,这里没有真正的问题,因为左操作数总是在右操作数之前计算(或者至少,程序必须具有与以这种方式完成的结果相同的结果) . 看看第一个链接“为什么会进入无限循环?”。这是一个 Java 代码示例 while(x 我应该提到的是,序列点问题实际上与 java 无关,它更多的是 C/C++,但 Java 中的评估顺序并不总是很明显。所以在这个程度上你是对的。 我读过这篇文章,但我不认为这真的是运算符优先级序列点问题的情况。评估顺序(对于二元运算符)始终为:1. 左操作数,2. 右操作数,3. 运算符。这里的问题是++运算符经常被解释错误。 这是一个误解了评估顺序的情况。学生期望 x++ 被评估并分配给 x。实际发生的情况是,为赋值创建了 x 的副本,原始 x 递增,然后分配副本,覆盖 x 中递增的值。糟糕的代码,但它说明了问题。

以上是关于Java中的算术运算符(初学者问题)的主要内容,如果未能解决你的问题,请参考以下文章

Java中的算术运算符

JAVA算术运算符介绍

int 的基本算术运算 - Java

是否可以将算术运算符传递给java中的方法?

JAVA 1.4 算术运算

为啥算术赋值运算符更有效? [复制]