關於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啦!
首先是位元運算子,根據查到的資料,位元運算有四種,這四種都有對應關係,分別是:
- AND 對應 &
- OR 對應 |
- XOR 對應 ^
- 補數 對應 ~
看樣子書上所講的邏輯運算子已經包含了大部分的位元運算子。
而其中剛剛那個網站裡面已經有範例了,所以在此略過。
至於位移運算子,其實剛剛那個在上面提到的範例中也有講到,這網站的作者想必是把位元和位移運算子放一起了。
以上,我大頭貼不錯看吧~哈哈!
沒有留言:
張貼留言
你好,我是小書,如果文章內容有錯誤,或是看到有建議以及任何感想時,歡迎提出分享,我們一起學習一起努力。