問題一:
JAVA中&&和&、||和|(短路與和邏輯與、短路或和邏輯或)的區(qū)別?
首先名稱是不同的
&&邏輯與 ?。壿嫽颉 ∷鼈兌际沁壿嬤\(yùn)算符
& 按位與 | 按位或 它們都是位運(yùn)算符
if(a==1&&b==2) 這是說既要滿足a=1也要滿足b=2
if(a==1||b==2) 這是說或者滿足a=1或者要滿足b=2
而a&b或者a|b則是二進(jìn)制的與或運(yùn)算
&同為1時為1,否則為0
|同為0時為0,否則為1
3&5則
?。埃埃保?br>
&0101
?。埃埃埃?br>
等于1
3|5則
?。埃埃保?br>
|0101
?。埃保保?br>
等于7
&&邏輯與 也叫做短路與 因?yàn)橹灰?dāng)前項(xiàng)為假,它就不往后判斷了,直接認(rèn)為表達(dá)式為假
||邏輯或 也叫做短路或 因?yàn)橹灰?dāng)前項(xiàng)為真,它也不往后判斷了,直接認(rèn)為表達(dá)式為真
問題二:
關(guān)于Java 中邏輯運(yùn)算與位運(yùn)算的區(qū)別(具體到解一道題)
題目出自Java2實(shí)用教程(第三版)(卻沒有解釋)
程序如下圖:
運(yùn)行結(jié)果如下:
為什么? x,y,a,b 不是都在IF語句里都重新賦值了嗎?按道理全為真了,y也該是20了吧?(用程序驗(yàn)證過了,的確是這個結(jié)果)
回答:
邏輯運(yùn)算符執(zhí)行的是短路求值
所謂短路,就是當(dāng)參與運(yùn)算的一個操作數(shù)已經(jīng)足以推斷出這個表達(dá)式的值的時候,另外一個操作數(shù)(有可能是表達(dá)式)就不會
執(zhí)行
比如:
static boolean f1() { System.out.println( "function f1
called." ); return true; }
static boolean f2() { System.out.println(
"function f2 called." ); return false; }
if ( false && f1() )
{} // f1不會被調(diào)用
if ( true || f2() ){} // f2不會被調(diào)用
由于&&
要求它的參與操作的兩個操作數(shù)都是布爾值真,才得真,所以只要得出其中一個為假,那么另一部分的表達(dá)式就不會被求值(在上面的例子中是f1()不會被調(diào)
用)
同理由于||要求它的參與操作的兩個操作數(shù)只要其中之一為真,就得真,所以只要得出其中一個為真,那么另一部分也不會被求值(在上面的例子中
是f2()不會被調(diào)用)
這就是邏輯操作符所謂的“短路求值”
位操作沒有這一特性,所以不管那邊的值是如
何,任何參與運(yùn)算的表達(dá)式都會被執(zhí)行求值,因此也就產(chǎn)生了你代碼之中的結(jié)果了。
三、Java中邏輯運(yùn)算短路的理解:
短路” 主要用于邏輯運(yùn)算符中,即 “ ! && || "這三種運(yùn)算符
短路 就是知如果左側(cè)的表達(dá)式能確定運(yùn)算后的結(jié)果,則不再計(jì)算右側(cè)的表達(dá)式。
如(1>2)&&(2<3) 明明左側(cè)已經(jīng)為假 了 ,我 不用計(jì)算右側(cè)我一定知道 此表達(dá)是為假,這樣
就好似物理中的電流,當(dāng)某處短路時,電流直接從一條路通過,而不再管另一條路。
看個例子:
public class Logic{
public static void main(String[] args){
int a = 1;
int b = 1;
if(a<b&&b<a++){
System.out.println(a>b&true);
System.out.println(a);
System.out.println("this's in my control");
}
else{
System.out.println("that's impossible");
System.out.println(a);
}
}
}
此處由于a<b為假 ,所以 后面的b<a++不會執(zhí)行
此處的結(jié)果為
that's impossible
1
若假設(shè)a的初值為0,此時a<b成立,這時就要計(jì)算后面的值了
結(jié)果應(yīng)該為和上面一樣。
網(wǎng)上看見有人對 && 與 & 有點(diǎn)混淆,順便說說我的理解
本來 & 是個 位運(yùn)算符
也就是主要用來 做二進(jìn)制運(yùn)算的,如 010101&101010 = 000000
但它的特別之處 在于 它可以 進(jìn)行 boolean值的運(yùn)算
就像我上面寫的 a>b&true
其實(shí)我想這追根究地 在于 boolean 在內(nèi)存中是用一位二進(jìn)制來表示的,故可以進(jìn)行位運(yùn)算
我們不能被表象所迷惑 ,認(rèn)為這是邏輯運(yùn)算 ,這樣理解就根本不存在討論短路的必要了。
|