Java逻辑运算符短路
哪个集合是短路,复杂条件表达式是短路的确切含义是什么Java逻辑运算符短路,java,logical-operators,Java,Logical Operators,哪个集合是短路,复杂条件表达式是短路的确切含义是什么 public static void main(String[] args) { int x, y, z; x = 10; y = 20; z = 30; // T T // T F // F T // F F //SET A boolean a = (x < z) && (x == x); boolean b = (x < z) && (x ==
public static void main(String[] args) {
int x, y, z;
x = 10;
y = 20;
z = 30;
// T T
// T F
// F T
// F F
//SET A
boolean a = (x < z) && (x == x);
boolean b = (x < z) && (x == z);
boolean c = (x == z) && (x < z);
boolean d = (x == z) && (x > z);
//SET B
boolean aa = (x < z) & (x == x);
boolean bb = (x < z) & (x == z);
boolean cc = (x == z) & (x < z);
boolean dd = (x == z) & (x > z);
}
publicstaticvoidmain(字符串[]args){
int x,y,z;
x=10;
y=20;
z=30;
//T T
//TF
//F T
//F
//设定
布尔值a=(xz);
//B组
布尔值aa=(xz);
}
集合A使用短路布尔运算符
在布尔运算符的上下文中,“短路”的意思是,对于一组布尔b1、b2、…、bn,短路版本将在第一个布尔为真(| |)或假(&&)时停止计算
例如:
// 2 == 2 will never get evaluated because it is already clear from evaluating
// 1 != 1 that the result will be false.
(1 != 1) && (2 == 2)
// 2 != 2 will never get evaluated because it is already clear from evaluating
// 1 == 1 that the result will be true.
(1 == 1) || (2 != 2)
&&
和|
操作员“短路”,这意味着如果没有必要,他们不会对右侧进行评估
当用作逻辑运算符时,&
和|
运算符始终对两侧进行求值
每个操作员只有一种短路情况,它们是:
-不必知道右边是什么,因为不管右边的值是多少,结果只能是false&&…
false
-不必知道右侧是什么,因为结果只能是true | |…
,而不管其值如何true
public boolean longerThan(String input, int length) {
return input != null && input.length() > length;
}
public boolean longerThan(String input, int length) {
return input != null & input.length() > length;
}
第二个版本使用非短路运算符&
,如果输入为null
,则会抛出NullPointerException
,但第1个版本会毫无例外地返回false
。,短路意味着一旦知道答案不能再改变,就停止评估。例如,如果你正在评估一组逻辑<代码>和 s,你发现在该链的中间有一个<代码> false >代码,你知道结果将是假的,不管该链中其余表达式的值是什么。一系列的或s也是如此:一旦你发现了真的,你就会马上知道答案,因此你可以跳过对其余表达式的求值
您可以通过使用&
而不是&
和|
而不是|
来向Java指示要短路。你文章中的第一组是短路
请注意,这不仅仅是为了节省几个CPU周期:在这样的表达式中
if (mystring != null && mystring.indexOf('+') > 0) {
...
}
短路意味着正确操作和崩溃之间的差异(在mystring为null的情况下)。短路意味着如果第一个操作员决定最终结果,则不会检查第二个操作员
表达式是:真| |假
在| |的情况下,我们所需要的只是其中一方为真。因此,如果左侧为真,则检查右侧没有意义,因此根本不会检查右侧
if(demon!=0&& num/demon>10)
类似地,False&&True
在&&的情况下,我们需要双方都为真。因此,如果左侧为假,那么检查右侧没有意义,答案必须为假。因此,这一点根本不会被检查
if(demon!=0&& num/demon>10)
由于使用了AND(&&)的短路形式,因此当demon为零时,不存在导致运行时异常的风险
参考文献:Herbert Schildt的《Java 2第五版》Java提供了在大多数其他计算机语言中找不到的两个有趣的布尔运算符。AND和OR的这些次要版本称为短路逻辑运算符。从上表可以看出,当A为true时,OR运算符的结果为true,而不管B是什么
类似地,当A为false时,AND运算符会导致false,而不管B是什么。如果您使用|
和&
形式,而不是这些运算符的
和&
形式,Java将不会费心单独计算右侧操作数。当右操作数依赖于左操作数为真或假以正常工作时,这非常有用
例如,以下代码片段显示了如何利用短路逻辑求值来确保除法运算在求值之前有效:
if ( denom != 0 && num / denom >10)
由于使用了AND(&&
)的短路形式,因此不存在导致运行时异常除以零的风险。如果这行代码是使用和的单个&
版本编写的,则必须对两侧进行求值,从而在denom
为零时导致运行时异常
标准做法是在涉及布尔逻辑的情况下使用AND和OR的短路形式,将单字符版本仅用于按位操作。然而,这条规则也有例外。例如,考虑下面的语句:
if ( c==1 & e++ < 100 ) d = 100;
if(c==1&e++<100)d=100;
这里,使用单个&
可确保无论c
是否等于1,增量运算都将应用于e
。逻辑or:-如果至少一个操作数的计算结果为true,则返回true。在应用OR运算符之前,对两个操作数进行求值
短路或:-如果左侧操作数返回true,则返回true而不计算右侧操作数 在&
和&
运算符之间存在一些差异。同样的差异也适用于|
和|
。要记住的最重要的一点是,&&
是一个仅适用于布尔操作数的逻辑运算符,而&
是一个
if ( c==1 & e++ < 100 ) d = 100;
(7 == 8) || ((1 == 3) && (4 == 4))