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++)")这个是我理解错误,那么错在哪,请高人详细些赐教
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 + 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运算优先级的问题的主要内容,如果未能解决你的问题,请参考以下文章