2

加号运算符的优先级在java 教程的优先级表中只列出一次。但是,以下 Java 表达式:

String unexpected = "1 + 1 = " + 1 + 1; 
String expected   = "1 + 1 = " + (1 + 1);
System.out.println(unexpected);
System.out.println(expected);

导致此输出:

1 + 1 = 11
1 + 1 = 2

这是否意味着加号运算符在用于连接字符串时具有更高的优先级,或者这是否意味着加号运算符的优先级对于字符串和数字没有什么不同,但它只是从左到右计算?

4

4 回答 4

8

这意味着它是从左到右评估的

于 2013-11-15T07:46:12.407 回答
2

从 jls SE8 15.18.1。字符串连接运算符+:+ 运算符在语法上是 左结合的,无论是通过类型分析确定是表示字符串连接还是数字加法。在某些情况下,需要小心才能获得所需的结果。例如,表达式:

a + b + c

总是被认为是意思:(a + b) + c

因此表达式:的结果1 + 2 + " fiddlers"
是:"3 fiddlers"

但结果"fiddlers " + 1 + 2
是:"fiddlers 12"

另一个例子:1 + 1 + "" + 1 + 1
将导致:211

这就是为什么,因为您的上下文"1 + 1 = " + 1 + 1;
将导致字符串1 + 1 = 11

但是,"1 + 1 = " + (1 + 1);会导致1 + 1 = 2

于 2013-11-15T07:58:25.043 回答
1

+总是从左向右流动

在您的第一个示例中String unexpected = "1 + 1 = " + 1 + 1;,首先是字符串,然后是 int 值,因此 1 被视为字符串。

在您的第二个示例String expected = "1 + 1 = " + (1 + 1);中,您使用()的优先级高于 + 运算符。(BODMAS

考虑另一个例子:

String unexpected1 =1+1+ "1 + 1 = " ;
 System.out.println(unexpected1);

输出将是21 + 1 =

这里 int 值首先出现所以 1+1 =2 然后是字符串文字所以 2 与 1+1= 连接

于 2013-11-15T07:59:19.117 回答
0

在字符串中使用 + 将触发连接而不是求和。
但是,当您使用 (1+1) 并使用 + 将其与 "1+1=" 相加时,括号内的表达式将首先被计算,然后连接到字符串的其余部分。计算括号内部的工作独立于字符串,因此 1 和 1 将被视为两个整数相加。

并且当使用相同的运算符时,所有内容都是从左到右评估的。您可以在此处找到运算符的评估顺序

于 2013-11-15T07:52:43.470 回答