在来自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
无一不op1
和op2
是*
,/
或者%
是等同于
(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 == !=