JAVA中和、||和|的区别?
問題一:JAVA中&&和&、||和|(短路與和邏輯與、短路或和邏輯或)的區(qū)別?
首先名稱是不同的
邏輯運算符:&&邏輯與 ||邏輯或 它們都是邏輯運算符
位運算符:& 按位與 | 按位或 它們都是位運算符
if(a==1&&b==2) 這是說既要滿足a=1也要滿足b=2
if(a==1||b==2) 這是說或者滿足a=1或者要滿足b=2
&&可以用作邏輯與的運算符,表示邏輯與(and),當運算符兩邊的表達式的結果都為true時,整個運算結果才為true,否則,只要有一方為false,則結果為false。
&&還具有短路的功能,即如果第一個表達式為false,則不再計算第二個表達式,例如,對于if(str != null && !str.equals(“”))表達式,當str為null時,后面的表達式不會執(zhí)行,所以不會出現(xiàn)NullPointerException;
||可以作邏輯或運算符,表示邏輯或(or),當運算符有一邊為true時,整個運算結果為true!當?shù)谝粋€表達式為true時,不再計算第二個表達式;
而a&b或者a|b則是二進制的與或運算
&同為1時為1,否則為0
|同為0時為0,否則為1
3&5則
0011
&0101
0001
等于1
3|5則
0011
|0101
0111
等于7
&&邏輯與 也叫做短路與 因為只要當前項為假,它就不往后判斷了,直接認為表達式為假
||邏輯或 也叫做短路或 因為只要當前項為真,它也不往后判斷了,直接認為表達式為真
問題二:關于Java 中邏輯運算與位運算的區(qū)別(具體到解一道題)
題目出自Java2實用教程(第三版)(卻沒有解釋)
程序如下圖:
運行結果如下:
為什么? x,y,a,b 不是都在IF語句里都重新賦值了嗎?按道理全為真了,y也該是20了吧?(用程序驗證過了,的確是這個結果)
回答:
邏輯運算符執(zhí)行的是短路求值
所謂短路,就是當參與運算的一個操作數(shù)已經(jīng)足以推斷出這個表達式的值的時候,另外一個操作數(shù)(有可能是表達式)就不會 執(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ù)都是布爾值真,才得真,所以只要得出其中一個為假,那么另一部分的表達式就不會被求值(在上面的例子中是f1()不會被調(diào) 用)
同理由于||要求它的參與操作的兩個操作數(shù)只要其中之一為真,就得真,所以只要得出其中一個為真,那么另一部分也不會被求值(在上面的例子中 是f2()不會被調(diào)用)
這就是邏輯操作符所謂的“短路求值”
位操作沒有這一特性,所以不管那邊的值是如 何,任何參與運算的表達式都會被執(zhí)行求值,因此也就產(chǎn)生了你代碼之中的結果了。
三、Java中邏輯運算短路的理解:
短路” 主要用于邏輯運算符中,即 “ ! && || "這三種運算符
短路 就是知如果左側(cè)的表達式能確定運算后的結果,則不再計算右側(cè)的表達式。
如(1>2)&&(2<3) 明明左側(cè)已經(jīng)為假 了 ,我 不用計算右側(cè)我一定知道 此表達是為假,這樣 就好似物理中的電流,當某處短路時,電流直接從一條路通過,而不再管另一條路。
看個例子:
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í)行
此處的結果為
若假設a的初值為0,此時a<b成立,這時就要計算后面的值了
結果應該為和上面一樣。
網(wǎng)上看見有人對 && 與 & 有點混淆,順便說說我的理解
本來 & 是個 位運算符
也就是主要用來 做二進制運算的,如 010101&101010 = 000000
但它的特別之處 在于 它可以 進行 boolean值的運算
就像我上面寫的 a>b&true
其實我想這追根究地 在于 boolean 在內(nèi)存中是用一位二進制來表示的,故可以進行位運算
我們不能被表象所迷惑 ,認為這是邏輯運算 ,這樣理解就根本不存在討論短路的必要了。
總結
以上是生活随笔為你收集整理的JAVA中和、||和|的区别?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 我的世界minecraft-Python
- 下一篇: @requestbody和@reques