java中位运算符的优先级

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java中位运算符的优先级相关的知识,希望对你有一定的参考价值。

++ * / >> << + - ^
比如说3+1*4<<2^8是怎么算的

指针最优,单目运算优于双目运算。如正负号。
先乘除(模),后加减。
先算术运算,后移位运算,最后位运算。请特别注意:1 << 3 + 2 & 7等价于 (1 << (3 + 2))&7.
逻辑运算最后计算。
参考技术A 不如直接百度了 。。。。。。。。。

多个 + 和 - 运算符的 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中位运算 12>>33 ,应该怎么计算?过程是啥?

剑指offer知识点Java中位运算的5个常用技巧函数

剑指offer知识点Java中位运算的5个常用技巧函数

剑指offer知识点Java中位运算的5个常用技巧函数

C/C++中位运算操作符的使用

转: C语言中位运算符异或“∧”的作用