java运算符优先级问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java运算符优先级问题相关的知识,希望对你有一定的参考价值。
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
public class C
public static void a()
long b = 2;
long a = (b<<65);
System.out.println(a);
public static void main(String[] args)
a();
JButton button = new JButton("123");
String str = button.getText();
ActionListener bl = new ActionListener()
@Override
public void actionPerformed(ActionEvent e)
//下面的语句中(JButton)e.getSource()是先算强制类型转换还是先算e.getSource(),
//记得是() [] . 这三个运算符是同级的并且是左结合
String name = ((JButton)e.getSource()).getText();
;
如果是先算e.getSource()那不就不符合运算符[] () . 这个同级运算符的左结合顺序了吗,这是不是矛盾了,有没有清楚这个的
然后进行类型转换,可以通过()来改变运算次序本回答被提问者采纳 参考技术C 强制转换不能用运算符来衡量咧
多个 + 和 - 运算符的 Java 优先级
【中文标题】多个 + 和 - 运算符的 Java 优先级【英文标题】:Java precedence for multiple + and - operators 【发布时间】:2017-03-19 20:27:26 【问题描述】:这更像是一个理论问题,用于理解 Java 对算术运算的评估。由于+
和-
具有相同的优先级,我不太明白Java 如何评估以下表达式(两个操作数之间有多个+
和-
运算符)。
public static void main(String[] args)
int a = 1;
int b = 2;
System.out.println(a+-b); // results in -1
System.out.println(a-+b); // results in -1
System.out.println(a+-+b); // results in -1
System.out.println(a-+-b); // results in 3
System.out.println(a-+-+b); // results in 3
System.out.println(a+-+-b); // results in 3
System.out.println(a-+-+-b); // results in -1
System.out.println(a+-+-+b); // results in 3
来自 Java 8 语言规范 (§15.8.2):
二进制 + 运算符在应用于两个数字类型的操作数时执行加法,产生操作数的和。 二元 - 运算符执行减法,产生两个数字操作数的差。 [...] 如果操作数表达式没有副作用,则加法是一种交换运算。 当操作数都是同一类型时,整数加法是关联的。
我还注意到,每次#operators 是偶数时,结果都是相同的,顺序无关紧要。
但是当#operators 是奇数时,这并不一定会影响结果。例如。在以下两个表达式中,-
比 +
多一个,但结果不同。
System.out.println(a-+-b); // results in 3
System.out.println(a-+-+-b); // results in -1
有了所有这些信息,我仍然看不到模式或它的工作方式。
【问题讨论】:
我相信 a+-b 被执行为 a+ (-b) 。检查出来 @Sanket Makani--
和 ++
在这种情况下是不允许的,因为 Java 将其视为递增/递减操作
【参考方案1】:
我相信-
符号否定表达式:
int a = 1;
int b = 2;
System.out.println(a+(-b));
System.out.println(a+-b);
两者都打印-1
。这是来自 oracle 文档:
一元减号运算符;否定表达式
减号只是改变它后面数字的符号。如果b
为负数,则a+-b
将返回3
。
【讨论】:
【参考方案2】:在数学方面,你会如何评价这个?
a - + - b
添加一些括号会有所帮助:
a - (+ (-b))
我们可以这样做,因为这不违反优先规则。
然后我们可以开始减少:+ (-b)
真的是-b
,而a - -b
真的是a + b
,所以结果是1 + 2 = 3
。
我们看第二个:
a - + - + - b
a - (+ (- (+ (-b))))
a - (+ (- (-b)))
a - (+ b)
a - b
1 - 2 = -1
如此简单的数学规则很自然。
【讨论】:
【参考方案3】:它的评估方式与您如何使用加法和减法进行数学计算一样。
在您的示例中,您的所有计算都从较小的数字a=1
开始,然后您有-
,并且+
符号介于一个小数字和一个大数字b=2 之间。例如,当您执行 1 -- 2
时,您正在执行 1+2
因为 2 个 -
符号相互取消变成 1 + 2
,1 - 2
将是 -1 因为 2(较大的数字有一个 - 符号,这使它成为负整数,负整数加1,其值加一
【讨论】:
【参考方案4】:这似乎是一个数学问题... (- & - = +)、(- & + = -) 和 (+ & + = +)
int a = 1;
int b = 2;
System.out.println(a+-b); // 1 +(-2) = 1-2 = -1
System.out.println(a-+b); // 1-(+2) = 1-2 = -1
System.out.println(a+-+b); // 1+-(+2) = 1-(+2) = 1-2 = 1
System.out.println(a-+-b); // 1- + (-2) = 1- (-2) = 1+2 =3
System.out.println(a-+-+b); // 1 - + - (+2) = 1 - - (+2) = 1-2 = -1
System.out.println(a+-+-b); // 1+ - + (-2) =1 - + (-2) = 1+2 = 3
System.out.println(a-+-+-b); // 1-+-+(-2) = 1 - - (-2) = 1 + (-2) = -1
System.out.println(a+-+-+b); // 1 +- +- (+2) = 1 -- (+2) = 1+2 = 3
【讨论】:
以上是关于java运算符优先级问题的主要内容,如果未能解决你的问题,请参考以下文章