串联字符串和数字Java
为什么在这些情况下输出会有所不同?
int x=20,y=10;
System.out.println("printing: " + x + y);
==> 打印:2010
System.out.println("printing: " + x * y);
==> 打印:200
为什么不是第一个输出30? 它与运算符优先级有关吗? 像第一次“打印”和x连接,然后这个结果字符串和y连接? 我对么?
它是BODMAS
规则
我在下面从高到低显示优先顺序:
B - Bracket O - Power DM - Division and Multiplication AS - Addition and Substraction
如果运算符具有相同的优先级 Left to Right
工作
现在
System.out.println("printing: " + x + y);
"printing: "
:是一个字符串“
"+"
:是Java中唯一一个将Number连接到String的重载运算符。 由于我们在这里有2个“+”运算符,并且x + y在"printing:" +
已经发生了,因此它将x和y视为字符串。
所以产量是2010年。
System.out.println("printing: " + x * y);
在这里
"*"
:优先级高于+
所以它的x*y
首先 printing: +
所以输出是200
如果你想在第一种情况下输出200作为这样做:
System.out.println("printing: "+ (x+y));
Bracket
的优先顺序 高于 Addition
。
基本数学告诉您每次都要添加数字。
所以首先计算"printing: " + x
。 因为它是string + int
,结果是"printing: 20"
。 然后你添加y
所以"printing: 20" + y
等于"printing: 2010"
。
在第二种情况下,乘法是先验的。 所以首先计算x * y
并且等于200
。 然后"printing: " + 200
等于"printing: 200"
。
您观察到的结果肯定与运算符优先级以及评估顺序有关 。 在没有其他规则(即具有更高优先级的运算符)的情况下,运算符按从左到右的顺序进行评估。
在第一个表达式中,所有运算符都具有相同的优先级,因为它们是相同的运算符: +
,因此计算第一个运算符。 因为它涉及一个String
,所以它是String
连接,结果是一个String
; 同样适用于以下+
。
在第二个表达式中,其中一个运算符是*
,其优先级高于+
,因此首先计算。 你得到乘法的结果,一个整数, 然后得到一个String
和一个由于+
的int
的连接。
这将打印30
:
System.out.println("printing: " + (x + y))
您需要括号来表达您希望的优先级。
它适用于运营商优先级
System.out.println("printing: " + x * y);
这里*运算符的优先级高于+,所以首先计算x * y
。
System.out.println("printing: " + x + y);
这里所有都是相同的运算符,它将被视为字符串连接操作,因为有一个string
值。
如果您将括号括在此 – System.out.println(“printing:”+(x + y));
然后括号(运算符优先于+,所以首先计算(x + y)
并打印30
检查详细运算符优先顺序
在第一个打印行中,+运算符首先应用于String和int之间,结果是一个String,它再次与另一个int连接,从而产生一个String。
在第二行中,操作的顺序是:首先将乘法和结果int连接到String。
System.out.println("2*("+a"+"+b"*"+c")")
如何打印这个