java运算优先级的问题

Posted

tags:

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

java的运算符优先级是,从高到低,递算比逻赋,但是很多语言中对于这块语句:

int a=1;
int b=0;
a=b++;
print a;
print b;

原谅我没把这段写规范。事实上对于这个print结果得到的是a=0,b=0,但是在“a=b++"中,按照递算比逻赋的顺序,递增运算应该在赋值之前运行,也就是说("a=b++" == "a=(b++)")为true,但是实际结果并不是我理解的这样,我虽然不是第一天学programming,我也知道结果应该是a=0,b=0,但还是有点绕不过来,到底我是哪里理解的不到位,如果说("a=b++" == "a=(b++)")这个是我理解错误,那么错在哪,请高人详细些赐教

如果("a=b++" == "a=(b++)")为true,那么Java或者C/C++的开创者们就没必要区分++i 和 i++有什么异同了,因为按照楼主的思维,他们结果一样。
Java中的自增(减)运算符和C/C++运算符的意义是一样的。以++为例:b=a++则表示先将a本来的值先赋值给b,而后自增1,这个楼主肯定比我都清楚。如果偏要去追究运算符的优先级,你得去问Java或者C/C++那些开创者了,为什么这样了。显然,不能太教条。追问

应该是a=0,b=1,提问时疏忽了,我想表达的是:这个句子a=b++,如果按照运算符优先级应该是++的优先级比=高,形如a=(b++),那么按照这样想,应该a=1,b=1;但是实际上a=b++等价于a=b;b=b+1;,即先=后++,这似乎与运算符优先级有悖,有些疑问。虽然已经习惯a=b++的结果是a=0;b=1;但是每每回想起这个,总觉得理解的还不够清晰

追答

知道这些就行,开发过程中的写代码不会引起歧义就行了。

参考技术A 你确定结果是a=0,b=0?我没有再Eclipse上运算,但是我感觉结果是a=0,b=1,
还有我不得不告诉你就算是a=(b++)。a的结果还是0
首先你必须知道在Java中,赋值号的优先级是非常低的绝对低于b++。所以有没有括号的优先级是一样的。
然后关于前++和后++的问题,我只能说这是一种规则。是该语言的规范。没有为什么的。
参考技术B java中
++(--)在前:先加再用
a=++b;-->a=(b+1)
++(--)在后:先用再加
a=b++;-->a=b;b++;
希望你能理解,答案是a=0,b=1
参考技术C 不知道你表达什么。
结果不可能是 0 0
而是 0 1
你先实际把程序跑一次,再来问,你想象的结果是不正确的。
参考技术D b++是先算,但不代表b++的结果就是递增后的值 第5个回答  2013-09-18 你的答案没错???答案难道不是a=0;b=1????

多个 + 和 - 运算符的 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 new运算符与点运算符优先级比较

Java运算符优先级谁知道?

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