Java中的布尔函数

时间:2014-03-20 07:26:40

标签: java string boolean println

String s1="hi";
String s2="hi";

boolean b1 = true;
boolean b2 = false;

(1) System.out.println(s1==s2);                            //true
(2) System.out.println(s1==s2 + s1==s2);                   //false
(3) System.out.println(s1==s2+ " " + s1==s2);              //false

(4) System.out.println(b1+b2);                             //error : bad operand types
(5) System.out.println(b1 + " " + b2);                     //true false
(6) System.out.println(true +" "+ s1==s2);                 //false
  • (2)&的区别是什么? (4)?
  • (3)&的区别是什么? (5)?
  • 为什么它在(3)&amp ;; (6)?

3 个答案:

答案 0 :(得分:12)

除了4之外,所有这些都依赖于运算符优先级。

在Java中,+优先于==

这意味着2实际上是“读”:

s1 == ((s2 + s1) == s2)

因此,第一个==的右侧操作数是一个布尔表达式,它将两个对象引用相互比较(事实上它们String在这里是无关紧要的)这里它们不是相同。因此,右侧操作数是布尔值false

但由于左侧操作数是String,并且由于==不适用于操作数Stringboolean,因此会产生编译错误。 JLS, section 15.21

  

可以使用相等运算符将两个可转换的操作数(第5.1.8节)与数值类型,或两个类型为boolean或Boolean的操作数,或两个操作数(分别为引用类型或null类型)进行比较。所有其他情况都会导致编译时错误。

如果这真的为你编译,你正在使用一个有缺陷的Java编译器,它将右侧操作数自动装箱到Boolean,它不应该。让我猜一下:Eclipse的ECJ?

4是错误,因为+运算符不接受boolean s作为操作数。

3读取与2几乎相同,只是这次s2 + " " + s1s2进行比较(尝试)。由于同样的原因,它无法编译。

在5中,由于字符串连接,布尔值被自动装箱。

6再次依赖于2中提到的运营商优先级;这次是字符串true + " " + s1,它是(引用)与s2比较(并且给出了假)。有关true的内容,请参阅5。

答案 1 :(得分:0)

What is the difference between (2) & (4)?

你的第二个陈述只是System.out.println(hi == hihi ==hi);而答案是假的,但你的第四个陈述是直截了当的

 What is the difference between (3) & (5)?

这与您之前的问题相同

Why it gives result false in (3) & (6)? 

您的第3个语句遵循上述内容,其中第6个语句转换为System.out.println("true hi" =="hi");且输出为false

P.S:'+'运算符在运算符先行

中排在第一位

答案 2 :(得分:0)

1)(2)&的区别是什么? (4)?

答案: - ==有更多优先于+所以第二个实际上读作“s1 ==((s2 + s1)== s2)”我们甚至无法想象(布尔值+布尔值)

2)(3)&的区别是什么? (5)?

Ans: - 第3个甚至不会编译,第5个是简单的put值b1 = true和b2 = false并且执行简单的字符串连接