串联字符串和数字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")")

如何打印这个