为什么(" str" + x == y)只编译参考类型?

时间:2014-06-21 21:46:50

标签: java operator-keyword equality

为什么==运算符与引用的行为不同于原始数据类型?

String string1 = "myString";
String string2 = "myString";
int num1 = 10;
int num2 = 10;
System.out.println("Value is "+string1==string2);   //WORKS FINE 
System.out.println("Value is "+num1==num2);         //COMPILE TIME ERROR

我无法弄清楚这背后的任何合理原因。
PS:故意不使用打印声明中的括号 谢谢:))

2 个答案:

答案 0 :(得分:10)

这是operator precedence的问题。您的第二个印刷语句被解释为:

System.out.println(("Value is "+num1)==num2);  // notice the parenthesis

尝试将字符串与int进行比较,从而产生编译时错误。添加括号以解决问题:

System.out.println("Value is " + (num1==num2));  // compiles

Operators中列出了Java运算符的优先级。

现在,这个:

// original:
System.out.println("Value is "+string1==string2);

// equivalent to:
System.out.println(("Value is "+string1)==string2);

有效,因为"Value is "+string1本身就是一个字符串,因此将string2==进行比较是有效的。

答案 1 :(得分:2)

这是因为operator precedence你不能将字符串与int进行比较。

问题1:

System.out.println("Value is "+num1==num2);  

+符号的优先级高于==,因此它首先执行+,然后执行==

执行+后,这是结果

 System.out.println("Value is 10"==num2);  //num1 is appended to the string

问题2:

"Value is 10"==num2

这是编译错误的来源,字符串不能与int进行比较。

<强>溶液

如果你想首先比较int,你需要将它包装在括号内以避免编译时错误

System.out.println("Value is "+ (num1==num2));