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 = 3
和3 % 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中的算术运算符(初学者问题)的主要内容,如果未能解决你的问题,请参考以下文章