JAVA--以例子來看&、&&與 |、||的差異


public class test023  {
    public static void main(String[] args) {
      
       int a = 1, b = 2; 
       
      if (a > 1 & b++ >2){ System.out.println("Hello"); } 
      System.out.println("a = " + a + ", b = " + b); 

      a = 1 ;
       b = 2 ;
       
      if (a > 1 && b++ > 2){ System.out.println("Hello"); } 
       System.out.println("a = " + a + ", b = " + b); 
     
     }

上面的結果如下:

a=1,b=3
a=1,b=2

雖然最後的結果都是 false,兩個if都看不到Hello,但是 b 的值卻有不同的變化。
當 a > 1 = false,「&」會繼續執行 b++,所以最後 b = 3
當 a > 1 = false,「&&」不會執行 b++ ,所以最後 b = 2

雖然左方運算的結果是false,已符合「and」邏輯,最後一定是false,但是「&」還是會執行右方的運算;
而「&&」發現左方運算的結果已經是false,就不需要再執行右方的運算。

但是如果把if的邏輯改為 a = 1 ,因為左方運算的結果為true,所以右方的運算無論如何都要執行,
才能知道最後的布林值是true或是false,所以兩個if最後 b = 3 


「|」與「||」也是一樣的道理,測試如下:
public class test024  {
    public static void main(String[] args) {
      
       int a = 2, b = 2; 
       
      if (a > 1 | b++ >2){ System.out.println("Hello"); } 
      System.out.println("a = " + a + ", b = " + b); 

      a = 2 ;
       b = 2 ;
       
      if (a > 1 || b++ > 2){ System.out.println("Hello"); } 
       System.out.println("a = " + a + ", b = " + b); 
     
     }
}

因為左方的運算 a > 1 是true,對「or」邏輯而言,已經決定最後的結果是true,
但是「|」還是會執行右方的運算,所以 b = 3;而「||」的 b = 2

如果改為 a < 1,則右方運算必定會執行,才能決定最後的結果是true或false,所以兩個b都是3