2017年3月22日 星期三

[Java] 邏輯運算子 &、| 、&&、|| 間運算上的差異

前言:

之前工作上在使用邏輯運算子判斷時,程式亂跑跑到跟我想的完全不一樣,後來開 debug 看才知道,原來是我自己的觀念不夠清楚。哈~因為自己的觀念不清楚導致 bug 產生,其實程式碼是不會錯的,會錯的是通常自己的思考邏輯寫錯。因此才會想說稍微複習一下,寫出這篇來提醒自己...


邏輯運算子
邏輯運算子
說明
範例
特性
AND
x & y
AND的特性只要1個運算元為 False,整個式子就為 False
運算時應該要同時拿2個運算元的資料來作運算。
OR
x | y
OR的特性只要1個運算元為True,整個式子就為 True
運算時應該要同時拿2個運算元的資料來作運算。
NOT
! a
如果條件為 True,則得到為 False。
&&
(短路型)
AND
x && y
AND的特性只要1個運算元為False,整個式子就為 False
假如第一個運算元的資料已經為False,就不會再判別第二個運算元資料,直接輸出False。
||
(短路型)
OR
x || y
OR的特性只要1個運算元為True,整個式子就為 True
假如第一個運算元的資料已經為True,就不會再判別第二個運算元資料,直接輸出 True。

程式碼(一):
package pkg;

public class Test {

    public static void main(String[] args) {
        try {
            int x = 0;
            int y = 3;
            if ((x != 0) & (y / x < 5)) {
                System.out.println("False - 跳離!");
            } else {
                System.out.println("x = " + x + " ; y = " + y);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

首先看到程式碼第九行使用的邏輯運算子,因為 &(AND) 運算符號會同時運算左右的2個運算元,所以當第十行執行到(y / x < 5)有錯誤時,會直接跳出,並在 catch 中印出錯誤訊息!


程式碼(一)執行會遇到除以0的錯誤!如下:

若將程式碼(一)的&改為&&,程式碼(二)如下:
package pkg;

public class Test {

    public static void main(String[] args) {
        try {
            int x = 0;
            int y = 3;
            if ((x != 0) && (y / x < 5)) {
                System.out.println("False - 跳離!");
            } else {
                System.out.println("x = " + x + " ; y = " + y);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

程式碼(二)這時並不會遇到除以0的錯誤,因為 && (Short-circuit AND) 在判別完第一個運算元
為False的時候,它就已經直接輸出False了!

程式碼(二),則得到的結果為:

沒有留言:

張貼留言

[java] 條件控制

前言: 在 java 的條件控制中可分為 if-else 架構、三元運算子、switch-case 架構這三類,其中 if-else、三元運算子為條件型的判斷,條件必須為 true/false布林值;switch-case 為比對變數型的判斷,條件值比較多可以是 char、...