我用java编写代码,输出为2 equals 11
。我的代码是
public class StringPrct
{
public static void main(String[]args)
{
String s= 1+1+" equals "+1 +1;
System.out.println(s);
}
}
现在的问题是为什么我没有得到2 equals 2
的输出。
+
运算符具有相同的优先级,无论是加法还是串联,并且从左到右关联。因此:
1 + 1 + " equals " + 1 + 1
评估为
(((1 + 1) + " equals ") + 1) + 1
((2 + " equals ") + 1) + 1
("2 equals " + 1) + 1
"2 equals 1" + 1
"2 equals 11"
如果你想覆盖它,你需要提供括号:
1 + 1 + " equals " + (1 + 1)
这变成:
((1 + 1) + " equals ") + (1 + 1)
(2 + " equals ") + (1 + 1)
"2 equals " + (1 + 1)
"2 equals " + 2
"2 equals 2"
为了清楚起见,您可能还应该在第一个1 + 1
中添加括号,这样阅读您代码的人就不必进行添加括号并向下评估的心理练习:
(1 + 1) + " equals " + (1 + 1)
1 + 1
是整数(2
)
2 + " equals "
被广播到字符串(2 equals
)
"2 equals " + 1
是字符串(2 equals 1
)
"2 equals 1" + 1
是字符串(2 equals 11
)
它应该是(1 + 1) + " equals " + (1 + 1)
在字符串中添加一个数字会得到一个字符串。1+1是2,因为您将int添加到int 2+"equals"是字符串,之后的任何东西都将被连接起来。
在一个字符串之后,Java看到其他连接的参数显然需要调用toString()。如果您将操作放在parens:中,向Java提供有关运算符顺序的提示,您将获得正确的输出
String s= (1+1) +" equals "+ (1 +1);