2013年1月14日 星期一

說說,關於java的運算子。


關於Java的運算子,重點還是在必須要非常的熟練,偏偏有些不常用會忘記,或是有某些設計時會需要用到,於是看著書本整理了一份筆記,然後這是實作的程式(java)。

關於運算子,有很多種,個人不愛理論敘述,比竟還是要實用。所以把它寫成了java code方便查閱。

算數運算子(Arithmatic Opterator):

  String newLineString="-----"; 
  printf(newLineString);
  //指派
  printf("指派 Assignment");
  int a=10;
  printf("a="+a);
  int b=a;
  printf("指派b=a, 得到b="+b);
  printf("這裡如果是物件要注意GC的回收機制..");
  printf(newLineString);
  //算數運算子
  printf("算數運算子 Arithmatic Opterator");
  int Aa=+50;
  printf("運算子的加號和減號可當正負數使用,這是正號: "+Aa);
  int Ab=-3;
  printf("運算子的加號和減號可當正負數使用,這是負號: "+Ab);
  int c=Aa+Ab;
  printf("當然也可以當運算符號使用,這是加法Aa+Ab: "+c);
  c=Aa-Ab;
  printf("這是剪法Aa-Ab: "+c);
  c=Aa*Ab;
  printf("這是乘法Aa*Ab: "+c);
  c=Aa/Ab;
  printf("這是除法Aa/Ab: "+c);
  c=Aa%Ab;
  printf("讓Aa除於Ab,取餘數Aa%Ab: "+c);
  printf(newLineString);
  Ab=5;
  printf("我們來觀察遞增和遞減的作法, Ab: "+Ab);
  Aa=Ab++;
  printf("Aa=Ab++;");
  printf("遞增的做法, Aa: "+Aa+", Ab: "+Ab);
  Ab=5;
  Aa=++Ab;
  printf("Aa=++Ab;");
  printf("遞增的做法2, Aa: "+Aa+", Ab: "+Ab);
  Ab=5;
  Aa=Ab--;
  printf("Aa=Ab--;");
  printf("遞減的做法, Aa: "+Aa+", Ab: "+Ab);
  Ab=5;
  Aa=--Ab;
  printf("Aa=--Ab;");
  printf("遞減的做法2, Aa: "+Aa+", Ab: "+Ab);


-----
指派 Assignment
a=10
指派b=a, 得到b=10
這裡如果是物件要注意GC的回收機制..
-----
算數運算子 Arithmatic Opterator
運算子的加號和減號可當正負數使用,這是正號: 50
運算子的加號和減號可當正負數使用,這是負號: -3
當然也可以當運算符號使用,這是加法Aa+Ab: 47
這是剪法Aa-Ab: 53
這是乘法Aa*Ab: -150
這是除法Aa*Ab: -16
讓Aa除於Ab,取餘數Aa%Ab: 2
-----
我們來觀察遞增和遞減的作法, Ab: 5
Aa=Ab++;
遞增的做法, Aa: 5, Ab: 6
Aa=++Ab;
遞增的做法2, Aa: 6, Ab: 6
Aa=Ab--;
遞減的做法, Aa: 5, Ab: 4
Aa=--Ab;
遞減的做法2, Aa: 4, Ab: 4


關係運算子(RelationAl Operator):

        String newLineString="-----";
        printf(newLineString);
        
        printf("關係運算子 RelationAl Operator");
        printf("關係運算子用來判斷等於、不等於、大於、小於、大於等於以及小於等於,回傳boolean值。");
        int a=543;
        int b=9527;
        printf("a= "+a+" ,b= "+b);
        printf("注意下面的算式中,運算子優先級別的關係,是可以work的,當然加上括號會更容易閱讀啦:p");
        boolean ans=a==b;
        printf("if(a==b): "+ans);
        ans=a!=b;
        printf("if(a!=b): "+ans);
        ans=a>b;
        printf("if(a>b): "+ans);
        ans=a<b;
        printf("if(a<b): "+ans);
        ans=a>=b;
        printf("if(a>=b): "+ans);
        ans=a<=b;
        printf("if(a<=b): "+ans);
        printf("建議可以改一下a和b的數值觀察更多變化。");
        
        
        printf(newLineString);


-----
關係運算子 RelationAl Operator
關係運算子用來判斷等於、不等於、大於、小於、大於等於以及小於等於,回傳boolean值。
a= 543 ,b= 9527
注意下面的算式中,運算子優先級別的關係,是可以work的,當然加上括號會更容易閱讀啦:p
if(a==b): false
if(a!=b): true
if(a>b): false
if(a<b): true
if(a>=b): false
if(a<=b): true
建議可以改一下a和b的數值觀察更多變化。
-----


邏輯運算子(Logic Operator):

這裡要注意的是&&和&、||和|的用法,不是因為很難,是因為google在搜尋的輸入上這兩個字不好找,弄混了要找到答案有點難。必須注意他們的和關係運算子的優先關係是相反的。

        String newLineString = "-----";
        printf(newLineString);
        printf("邏輯運算子 Logic Operator");
        printf("這裡會比較複雜。請先了解Integer是整數型別的物件,物件中判斷等於是使用.equals()方法。");
        Integer aInteger = null, bInteger = new Integer(55), cInteger = new Integer(
                44);
        boolean ans = !(aInteger == null);
        printf("我們已知aInteger為null,前面加上驚嘆號為不等於,所以原本ans為true,加上不等於這個程咬金,會變成: "
                + ans);
        printf(newLineString);
        printf("&&使用方法:");
        ans = (cInteger.equals(44)) && (aInteger == null);
        printf("(cInteger.equals(44))&&(aInteger==null), 可知應該為: " + ans);
        printf("這是有先後判斷順序的,如果我們把44改成別的45");
        ans = (cInteger.equals(45)) && (aInteger == null);
        printf("(cInteger.equals(45))&&(aInteger==null), 會得到答案為: " + ans);
        printf("接著,我們要介紹&使用方法,注意在運算順序上不同,請注意我們使用到try catch捕獲錯誤:");
        try {
            ans = (cInteger.equals(45)) & (aInteger.equals(321));
        } catch (Exception e) {
            printf("(cInteger.equals(45))&(aInteger.equals(321)), 這裡會返回異常: "
                    + e);
        }
        printf("比較相同的式子&&和&的用法:");
        try {
            ans = (cInteger.equals(45)) && (aInteger.equals(321));
            printf("(cInteger.equals(45)) && (aInteger.equals(321)), 因為一開始就為false了,所以不會返回異常: "+ans);
        } catch (Exception e) {
            printf("(cInteger.equals(45))&&(aInteger.equals(321)),如果有異常發生: "+e);
        }
        printf(newLineString);
        printf("承接&&方法,我們來介紹||用法:");
        ans = (cInteger.equals(44)) || (aInteger != null);
        printf("(cInteger.equals(44))||(aInteger!=null), 可知應該為: " + ans);
        printf("這是有先後判斷順序的,如果我們把44改成別的45");
        ans = (cInteger.equals(45)) || (aInteger != null);
        printf("(cInteger.equals(45))||(aInteger!=null), 會得到答案為: " + ans);
        printf("接著,我們要介紹|使用方法,注意在運算順序上不同,請注意我們使用到try catch捕獲錯誤:");
        try {
            ans = (cInteger.equals(44)) | (aInteger.equals(321));
        } catch (Exception e) {
            printf("(cInteger.equals(44))|(aInteger.equals(321)), 這裡會返回異常: "
                    + e);
        }
        printf("比較相同的式子||和|的用法:");
        try {
            ans = (cInteger.equals(44)) || (aInteger.equals(321));
            printf("(cInteger.equals(44)) || (aInteger.equals(321)), 因為一開始就為false了,所以不會返回異常: "+ans);
        } catch (Exception e) {
            printf("(cInteger.equals(44))||(aInteger.equals(321)),如果有異常發生: "+e);
        }
        

        printf(newLineString);


-----
邏輯運算子 Logic Operator
這裡會比較複雜。請先了解Integer是整數型別的物件,物件中判斷等於是使用.equals()方法。
我們已知aInteger為null,前面加上驚嘆號為不等於,所以原本ans為true,加上不等於這個程咬金,會變成: false
-----
&&使用方法:
(cInteger.equals(44))&&(aInteger==null), 可知應該為: true
這是有先後判斷順序的,如果我們把44改成別的45
(cInteger.equals(45))&&(aInteger==null), 會得到答案為: false
接著,我們要介紹&使用方法,注意在運算順序上不同,請注意我們使用到try catch捕獲錯誤:
(cInteger.equals(45))&(aInteger.equals(321)), 這裡會返回異常: java.lang.NullPointerException
比較相同的式子&&和&的用法:
(cInteger.equals(45)) && (aInteger.equals(321)), 因為一開始就為false了,所以不會返回異常: false
-----
承接&&方法,我們來介紹||用法:
(cInteger.equals(44))||(aInteger!=null), 可知應該為: true
這是有先後判斷順序的,如果我們把44改成別的45
(cInteger.equals(45))||(aInteger!=null), 會得到答案為: false
接著,我們要介紹|使用方法,注意在運算順序上不同,請注意我們使用到try catch捕獲錯誤:
(cInteger.equals(44))|(aInteger.equals(321)), 這裡會返回異常: java.lang.NullPointerException
比較相同的式子||和|的用法:
(cInteger.equals(44)) || (aInteger.equals(321)), 因為一開始就為false了,所以不會返回異常: true
-----


指定運算子(Assignment Operator),這裡我們要注意"<<"、">>"和">>>"的用法,他會轉為二進制來處理。

        String newLineString = "-----";
        printf(newLineString);
        printf("指定運算子 Assignment Operator");
        printf("除了指派(=)以外,還有其他運算子");
        int a = 1, b = 2;
        printf("初始化, a= " + a + " ,b= " + b);
        a = b;
        printf("a=b,指派運算 a= " + a + " ,b= " + b);
        a = 1;
        b = 2;
        printf("初始化");
        a += b;
        printf("a+=b,相當於a=a+b, a= " + a + " ,b= " + b);
        a = 1;
        b = 2;
        printf("初始化");
        a -= b;
        printf("a-=b,相當於a=a-b, a= " + a + " ,b= " + b);
        a = 1;
        b = 2;
        printf("初始化");
        a *= b;
        printf("a*=b,相當於a=a*b, a= " + a + " ,b= " + b);
        a = 1;
        b = 2;
        printf("初始化");
        a /= b;
        printf("a/=b,相當於a=a/b, a= " + a + " ,b= " + b);
        a = 1;
        b = 2;
        printf("初始化");
        a %= b;
        printf("a%=b,相當於a=a%b, a= " + a + " ,b= " + b);
        a = 1;
        b = 2;
        printf("初始化");
        a &= b;
        printf("a&=b,相當於a=a&b, a= " + a + " ,b= " + b);
        a = 1;
        b = 2;
        printf("初始化");
        a |= b;
        printf("a|=b,相當於a=a|b, a= " + a + " ,b= " + b);
        a = 1;
        b = 2;
        printf("初始化");
        a ^= b;
        printf("a^=b,相當於a=a^b, a= " + a + " ,b= " + b);
        a = 1;
        b = 2;
        printf("初始化");
        a >>= b;
        printf("a>>=b,相當於a=a>>b, a= " + a + " ,b= " + b);
        a = 1;
        b = 2;
        printf("初始化");
        a <<= b;
        printf("a<<=b,相當於a=a<<b, a= " + a + " ,b= " + b);
        a = 1;
        b = 2;
        printf("初始化");
        a >>>= b;
        printf("a>>>=b,相當於a=a>>>b, a= " + a + " ,b= " + b);

        printf(newLineString);


-----
指定運算子 Assignment Operator
除了指派(=)以外,還有其他運算子
初始化, a= 1 ,b= 2
a=b,指派運算 a= 2 ,b= 2
初始化
a+=b,相當於a=a+b, a= 3 ,b= 2
初始化
a-=b,相當於a=a-b, a= -1 ,b= 2
初始化
a*=b,相當於a=a*b, a= 2 ,b= 2
初始化
a/=b,相當於a=a/b, a= 0 ,b= 2
初始化
a%=b,相當於a=a%b, a= 1 ,b= 2
初始化
a&=b,相當於a=a&b, a= 0 ,b= 2
初始化
a|=b,相當於a=a|b, a= 3 ,b= 2
初始化
a^=b,相當於a=a^b, a= 3 ,b= 2
初始化
a>>=b,相當於a=a>>b, a= 0 ,b= 2
初始化
a<<=b,相當於a=a<<b, a= 4 ,b= 2
初始化
a>>>=b,相當於a=a>>>b, a= 0 ,b= 2
-----

三元運算子(Ternary Operator):

        String newLineString = "-----";
        printf(newLineString);
        printf("三元運算子 Ternary Operator");
        printf("用法其實和if else一樣,化減code長度用的..");
        int trueInt=55,falseInt=24;
        boolean a=true,b=false;
        printf("初始化, trueInt: "+trueInt+" ,falseInt: "+falseInt+" ,a: "+a+" ,b: "+b);
        
        int ans=a?trueInt:falseInt;
        printf("a?trueInt:falseInt: "+ans);
        ans=b?trueInt:falseInt;
        printf("b?trueInt:falseInt: "+ans);
        
        printf(newLineString);


-----
三元運算子 Ternary Operator
用法其實和if else一樣,化減code長度用的..
初始化, trueInt: 55 ,falseInt: 24 ,a: true ,b: false
a?trueInt:falseInt: 55
b?trueInt:falseInt: 24
-----

接下來還有位元運算子(Bitwise Operator)和位移運算子(Shift Operator),這兩部份書上沒有,所以就Google啦!

首先是位元運算子,根據查到的資料,位元運算有四種,這四種都有對應關係,分別是:

  1. AND 對應 &
  2. OR 對應 |
  3. XOR 對應 ^
  4. 補數 對應 ~

看樣子書上所講的邏輯運算子已經包含了大部分的位元運算子。
而其中剛剛那個網站裡面已經有範例了,所以在此略過。

至於位移運算子,其實剛剛那個在上面提到的範例中也有講到,這網站的作者想必是把位元和位移運算子放一起了。

以上,我大頭貼不錯看吧~哈哈!


















沒有留言:

張貼留言

你好,我是小書,如果文章內容有錯誤,或是看到有建議以及任何感想時,歡迎提出分享,我們一起學習一起努力。

追蹤者