java的逻辑运算符
逻辑运算符AND(&&)、OR(||)以及NOT(!)能生成一个布尔值(true或false)——以自变量的逻辑干系为基本。下面这个例子向各人展示了如何利用干系和逻辑运算符。
//: Bool.java // Relational and logical operators import java.util.*; public class Bool { public static void main(String[] args) { Random rand = new Random(); int i = rand.nextInt() % 100; int j = rand.nextInt() % 100; prt("i = " + i); prt("j = " + j); prt("i > j is " + (i > j)); prt("i < j is " + (i < j)); prt("i >= j is " + (i >= j)); prt("i <= j is " + (i <= j)); prt("i == j is " + (i == j)); prt("i != j is " + (i != j)); // Treating an int as a boolean is // not legal Java //! prt("i && j is " + (i && j)); //! prt("i || j is " + (i || j)); //! prt("!i is " + !i); prt("(i < 10) && (j < 10) is " + ((i < 10) && (j < 10)) ); prt("(i < 10) || (j < 10) is " + ((i < 10) || (j < 10)) ); } static void prt(String s) { System.out.println(s); } } ///:~
只可将AND,OR或NOT应用于布尔值。与在C及C++中差异,不行将一个非布尔值看成布尔值在逻辑表达式中利用。若这样做,就会发明实验失败,并用一个“//!”标出。然而,后续的表达式操作干系较量生成布尔值,然后对功效举办逻辑运算。
输出列表看起来象下面这个样子:
i = 85 j = 4 i > j is true i < j is false i >= j is true i <= j is false i == j is false i != j is true (i < 10) && (j < 10) is false (i < 10) || (j < 10) is true
留意若在估量为String值的处所利用,布尔值会自动转换成适当的文本形式。
在上述措施中,可将对int的界说替换成除boolean以外的其他任何主数据范例。但要留意,对浮点数字的较量长短常严格的。纵然一个数字仅在小数部门与另一个数字存在极微小的差别,仍然认为它们是“不相等”的。纵然一个数字只比零大一点点(譬喻2不断地开平方根),它仍然属于“非零”值。
1. 短路
操纵逻辑运算符时,我们会碰着一种名为“短路”的环境。这意味着只有明晰得出整个表达式真或假的结论,才会对表达式举办逻辑求值。因此,一个逻辑表达式的所有部门都有大概不举办求值:
//: ShortCircuit.java // Demonstrates short-circuiting behavior // with logical operators. public class ShortCircuit { static boolean test1(int val) { System.out.println("test1(" + val + ")"); System.out.println("result: " + (val < 1)); return val < 1; } static boolean test2(int val) { System.out.println("test2(" + val + ")"); System.out.println("result: " + (val < 2)); return val < 2; } static boolean test3(int val) { System.out.println("test3(" + val + ")"); System.out.println("result: " + (val < 3)); return val < 3; } public static void main(String[] args) { if(test1(0) && test2(2) && test3(2)) System.out.println("expression is true"); else System.out.println("expression is false"); } } ///:~
每次测试城市较量自变量,并返回真或假。它不会显示与筹备挪用什么有关的资料。测试在下面这个表达式中举办:
if(test1(0)) && test2(2) && test3(2))
很自然地,你也许认为所有这三个测试城市得以执行。但但愿输出功效不至于使你大吃一惊:
if(test1(0) && test2(2) && test3(2))
第一个测试生成一个true功效,所以表达式求值会继承下去。然而,第二个测试发生了一个false功效。由于这意味着整个表达式必定为false,所觉得什么还要继承剩余的表达式呢?这样做只会徒劳无益。事实上,“短路”一词的由来正种因于此。假如一个逻辑表达式的所有部门都不必执行下去,那么潜在的机能晋升将是相当可观的。