Java中字符串和数字的拼接

18

为什么这些情况下输出不同?

int x=20,y=10;

System.out.println("printing: " + x + y); ==> printing: 2010

System.out.println("printing: " + x * y); ==> printing: 200

为什么第一个输出结果不是30呢?这和操作符优先级有关吗?比如先将"printing"和x连接起来,然后将得到的字符串和y连接起来?我的理解正确吗?


2
打印:将 x 转换为字符串,然后加上 y 只是字符串连接。而在 xy 中,'' 首先执行,因此你将得到 200。 - Avichal Badaya
你以为自己知道答案,只是出于好玩而提问 ;) - Senthil Kumar
@SenthilKumar 我不确定答案。 - h4ck3d
7个回答

27

这是 BODMAS 规则。

下面是按从高到低的优先顺序展示:

B  - Bracket 
O  - Power
DM - Division and Multiplication
AS - Addition and Substraction

如果运算符具有相同的优先级,则从左向右执行。

现在:

System.out.println("printing: " + x + y);

"printing: " : 是一个字符串

"+" :是Java中唯一重载的运算符,可将数字连接到字符串。由于此处存在2个"+"运算符,并且"printing:" +已经发生了,所以它也会将x和y视为字符串。

因此输出为2010。

System.out.println("printing: " + x * y);

这里:

"*":比+具有更高的优先级

所以首先执行x*y然后执行printing: +

因此输出为200。

如果想要在第一个例子中得到200,请像这样操作:

System.out.println("printing: "+ (x+y));

括号的优先级高于加法


9

基本数学告诉我们,将数字相加是逐个完成的。

因此,先计算"printing: " + x。由于它是一个字符串 + 整数,结果为"printing: 20"。然后再加上y,所以"printing: 20" + y等于"printing: 2010"

在第二种情况下,乘法具有优先权。因此,首先计算x * y,结果为200。然后"printing: " + 200等于"printing: 200"


4
你所观察到的结果与运算符的优先级和计算顺序有关。在没有其他规则的情况下,即没有更高优先级的运算符,运算符从左到右依次计算。
在第一个表达式中,所有运算符具有相同的优先级,因为它们是相同的运算符:+,因此首先计算第一个操作。由于它涉及到一个字符串,所以这是字符串连接,结果是一个字符串;对于后面的+也是如此。
在第二个表达式中,其中一个运算符是*,它比+的优先级更高,因此首先计算它。你会得到乘法的结果,一个整数,然后由于+的存在,将字符串和int进行连接。

1

这是用于操作符优先级的

System.out.println("printing: " + x * y);

在这里,* 运算符比 + 运算符的优先级更高,因此首先计算 x * y

System.out.println("printing: " + x + y);

在这里,所有的操作符都是相同的,因为有一个string值,所以它将被视为字符串连接操作。

如果你把括号加进去 - System.out.println("printing: " + (x + y));

那么括号(操作符比+优先级更高,所以它将首先计算(x + y)并打印30

检查详细的操作符优先级顺序


1

这将打印30

System.out.println("printing: " + (x + y))

您需要使用括号来表达您想要的优先级。


3
我知道!但那不是我的问题。 - h4ck3d
它只需要实际阅读Java运算符优先级规则即可。 - duffymo

0
在第一条打印语句中,首先在字符串和整数之间应用+运算符,结果是一个字符串,再将其与另一个整数连接起来,得到一个字符串。
在第二条语句中,操作顺序是:首先进行乘法运算,然后将结果的整数连接到字符串上。

-1

System.out.println("2*("+a"+"+b"*"+c")")

如何打印这个?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接