2013-11-15 38 views
2

加号运算符的优先级仅在java tutorial precedence table中列出一次。然而,以下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 

这是否意味着加操作具有更高的优先级用于连接字符串的时候,还是意味着加运算符的优先级是字符串和数字没有什么不同,但它只是从左到右进行评估?

+0

它为什么不同?所有字符串连接都使用StringBuilder进行编译。所以这与评估无关,而与编译无关。 – Mikhail

回答

1

+总是从left to right

在你的第一个例子String unexpected = "1 + 1 = " + 1 + 1;,字符串先到,t hen 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 =

0

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

而当使用相同的运算符时,所有内容都从左到右进行评估。 有评价运营商的订单,你可以找到here

2

From jls SE8 15.18.1. String Concatenation Operator +:+运营商在语法上是左结合,不管它是否被 类型的分析确定为代表字符串连接或数字相加。在某些情况下,护理需要 以获得所需的结果。例如,表达式:

a + b + c 

始终被看作含义:​​8566042208

因此,表达式的结果: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