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()那不就不符合运算符[] () . 这个同级运算符的左结合顺序了吗,这是不是矛盾了,有没有清楚这个的

参考技术A 先算e.getSource(),再算前面的JButton 参考技术B 先算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 + 21 - 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运算符优先级问题的主要内容,如果未能解决你的问题,请参考以下文章

在java运算符&&,,==,+中优先级最高的是

Java 运算符优先级准则

多个 + 和 - 运算符的 Java 优先级

Java中的运算符优先级

java new运算符与点运算符优先级比较

Java 运算符优先级