ban*_*cer 14 java math operator-precedence
Java中此表达式中数学运算的正确顺序是什么:
a + b * c / ( d - e )
1. 4 1 3 2
2. 4 2 3 1
Run Code Online (Sandbox Code Playgroud)
我知道两个答案的结果是一样的.但我想完全理解java编译器逻辑.在这个例子中首先执行的是什么 - 乘法或括号中的表达式?指向文档的链接将有所帮助.
更新:谢谢你们的答案.大多数人写道,首先评估括号中的表达式.在查看Grodriguez提供的参考资料后,我创建了一些测试:
int i = 2;
System.out.println(i * (i=3)); // prints '6'
int j = 2;
System.out.println((j=3) * j); // prints '9'
Run Code Online (Sandbox Code Playgroud)
谁能解释为什么这些测试会产生不同的结果?如果评估括号中的表达式,我会期望得到相同的结果 - 9.
Gro*_*uez 13
正如JeremyP 向我们展示的那样,第一个答案是正确的.
通常,以下规则适用:
||,&&和? :)请注意,前两个规则解释了第二个问题的结果:
int i = 2;
System.out.println(i * (i=3)); // prints '6'
int j = 2;
System.out.println((j=3) * j); // prints '9'
Run Code Online (Sandbox Code Playgroud)
参考文件:
http://java.sun.com/docs/books/jls/second_edition/html/expressions.doc.html#4779
教程:
http://download.oracle.com/javase/tutorial/java/nutsandbolts/operators.html
Jer*_*myP 10
到目前为止,几乎每个人都将评估顺序与运营商优先级混为一谈.在Java中,优先规则使表达式等效于以下内容:
a + (b * c) / ( d - e )
Run Code Online (Sandbox Code Playgroud)
因为*并且/具有相同的优先权并且是左联的.
评估顺序严格定义为左手操作数,然后是右手,然后是操作(除了||和&&).所以评估的顺序是:
a
b
c
*
d
e
-
/
+
Run Code Online (Sandbox Code Playgroud)
评估顺序在页面下方.缩进反映了语法树的结构
编辑
回应格罗德里格斯的评论.以下程序:
public class Precedence
{
private static int a()
{
System.out.println("a");
return 1;
}
private static int b()
{
System.out.println("b");
return 2;
}
private static int c()
{
System.out.println("c");
return 3;
}
private static int d()
{
System.out.println("d");
return 4;
}
private static int e()
{
System.out.println("e");
return 5;
}
public static void main(String[] args)
{
int x = a() + b() * c() / (d() - e());
System.out.println(x);
}
}
Run Code Online (Sandbox Code Playgroud)
产生输出
a
b
c
d
e
-5
Run Code Online (Sandbox Code Playgroud)
这清楚地表明在减法之前执行乘法.