作為一門計算機語言,肯定要涉及數學運算,運算離不開運算符,Java也提供了一套豐富的運算符來操作變量。
算術運算符 | 一進制運算符 | ++,-- |
---|---|---|
二進制運算符 | +,-,*,/,% | |
指派運算符 | = | |
擴充運算符 | +=,-=,*=,/= | |
關系運算符 | >,<,>=,<=,==,!=,instanceof | |
邏輯運算符 | &&,||,!,^ | |
位運算符 | &,|,^,~,>>,<<,>>> | |
條件運算符 | ?: | |
字元串連接配接符 | + |
目錄
1、算數運算符
1、一進制運算符
2、二進制運算符
2、指派運算符
3、擴充運算符
4、關系運算符
5、邏輯運算符
6、位運算符
7、條件運算符
8、字元串連接配接符
算數運算符中++,--屬于一進制運算符, 該類運算符隻需要一個操作數。
1、無論是++還是--,每次運算量為1。
2、運算符在前面++a;先運算,再指派。
3、運算符在後面a++;先指派,再運算。
public class TestArithmeticOneOperator {
/**
* @param args
*/
public static void main(String[] args) {
int a = 2;
System.out.println("a="+a); //a=2
int b = a++; //先給b指派,a再加1
System.out.println("a="+a); //a=3
System.out.println("b="+b); //b=2
int c =++a; //a先加1,再給c指派
System.out.println("a="+a); //a=4
System.out.println("c="+c); //c=4
int d =--a; //a先減1,再給d指派
System.out.println("a="+a); //a=3
System.out.println("d="+d); //d=3
}
}
結果
a=2
a=3
b=2
a=4
c=4
a=3
d=3
算數運算符中+,-,*,/,%屬于二進制運算符, 二進制運算符指的是需要兩個操作數才能完成運算的運算符,其中%是取模運算符,就是我們常說的求餘數操作。
二進制運算符的運算規則
整數運算:
1、如果兩個操作數有一個為long,則結果也為long.
2、沒有long時,結果為int。即使操作數全為short,byte,結果也為int。
浮點運算:
1、如果兩個操作數有一個為double,則結果為double。
2、隻有兩個操作數都是float,則結果為float。
取模運算:
1、其操作數可以為浮點數,一般使用整數,結果是“餘數”,“餘數”符号和左邊操作數相同,如:10%3=1,-11%3=-2;11%-3=2
public class TestArithmeticTwoOperator {
/**
* @param args
*/
public static void main(String[] args) {
byte a = 'a'; //a為97
System.out.println("a="+a); //a為97
short b = 2;
System.out.println("b="+b); //b=2
//byte c = a+b; //報錯Type mismatch: cannot convert from int to byte,可見a+b是int類型,而不是short類型
int c = a+b; //97+2=99
System.out.println("c=a+b="+c); //c=97+2=99
long d = 3L;
System.out.println("d="+d); //d=3
//int e = a+d; //報錯Type mismatch: cannot convert from long to int,可見a+d是long類型
long e = a+d; //97+3=100
System.out.println("e=a+d="+e); //e=97+3=100
int f = 2*++b; //
System.out.println("f=2*++b="+f); //f=2*(++b)=2*3=6,b先運算為3,在*2指派給f,此時b=3
System.out.println("b="+b); //b=3
long g = 2*--d;
System.out.println("g=2*--d="+g); //g=2*(--d)=2*2=4,d先運算為2,在*2指派給g,此時d=2
System.out.println("d="+d); //d=2
long h = 2*d--;
System.out.println("h=2*d--="+h); //h=2*2=4,d先*2指派給h,再運算--為1,此時d=d--=1
System.out.println("d="+d); //d=1
System.out.println("-11%3="+-11%3); //-11%3=-3......-2
System.out.println("-11%-3="+-11%-3); //-11%-3=3......-2
System.out.println("11%-3="+11%-3); //11%-3=-3......2
}
}
a=97
b=2
c=a+b=99
d=3
e=a+d=100
f=2*++b=6
b=3
g=2*--d=4
d=2
h=2*d--=4
d=1
-11%3=-2
-11%-3=-2
11%-3=2
int a = 3;int b = a;相當于把3指派給a,把a的值賦給b;
運算符 | 用法舉例 | 等效的表達式 |
---|---|---|
+= | a+=b | a=a+b |
-= | a-=b | a=a-b |
*= | a*=b | a=a*b |
/= | a/=b | a=a/b |
%= | a%=b | a=a%b |
public class TestExtendedOperator {
/**
* @param args
*/
public static void main(String[] args) {
int a = 1;
int b = 2;
a+=b; //a=a+b=1+2=3
System.out.println("a="+a);
a-=b; //a=a-b=3-2=1
System.out.println("a="+a);
a*=b; //a=a*b=1*2=2
System.out.println("a="+a);
a/=b; //a=a/b=2/2=1
System.out.println("a="+a);
a%=b; //a=a%b=1%2=0......1
System.out.println("a="+a);
a*=b+1; //a=a*(b+1)=1*(2+1)=3
System.out.println("a="+a);
a*=++b; //a=a*(++b)=3*3=9,b=3
System.out.println("a="+a);
System.out.println("b="+b);
a*=b--;
System.out.println("a="+a); //a=a*b=9*3=27,b=b--=2
System.out.println("b="+b); //b=b--=2
a*=b++; //a=a*b=27*2=54,b=b++=3
System.out.println("a="+a);
System.out.println("b="+b); //b=b++=3
}
}
a=3
a=1
a=2
a=1
a=1
a=3
a=9
b=3
a=27
b=2
a=54
b=3
關系運算符用來比較運算,且運算的結果是布爾值:true/false
含義 | 示例 | |
---|---|---|
== | 等于 | a==b |
!= | 不等于 | a!=b |
> | 大于 | a>b |
< | 小于 | a<b |
>= | 大于或者等于 | a>=b |
<= | 小于或者等于 | a<=b |
注意事項:
1、=是指派運算符,而真正的判斷兩個操作數是否相等的運算符是==。
2、==、!=是所有(基本和引用)資料類型都有可以使用。
3、>、>=、<、<=僅針對數值類型(byte、short、int、long、float、double。以及char)。
public class TestRelationalOperator {
/**
* @param args
*/
public static void main(String[] args) {
char a = 'a';
short b = 97;
int c = 98;
float d = 97.1f;
if(b==a){
System.out.println("b==a");
}
if(c>=a){
System.out.println("c>=a");
}
if(a<=d){
System.out.println("a<=d");
}
}
}
b==a
c>=a
a<=d
邏輯運算的操作數和運算結果都是 boolean值。
說明 | ||
---|---|---|
邏輯與 | &(與) | 兩個操作數位true,結果才是true,否則是false |
邏輯或 | |(或) | 兩個操作數有一個true,結果就是true |
短路與 | &&(與) | 隻要有一個為false,則直接傳回false |
短路或 | ||(或) | 隻要有一個為true,則直接傳回true |
邏輯非 | !(非) | 取反:!false為true,!true為false |
邏輯異或 | ^(異或) | 相同為false,不同為true |
public class TestLogicalOperator {
/**
* @param args
*/
public static void main(String[] args) {
boolean a1 = true;
boolean a2 = false;
int b1 = 2;
int b2 = 2;
System.out.println("a1&a2="+(a1&a2)); //false,a2為false,是以為fasle
System.out.println("a1|a2="+(a1|a2)); //true,a1為true,是以為true
System.out.println("a1&&a2="+(a1&&a2)); //false,a2為false,是以為fasle
System.out.println("a1||a2="+(a1||a2)); //true,a1為true,是以為true
System.out.println("!a1="+(!a1)); //false,a1為true,是以!a1為false
System.out.println("a1^a2="+(a1^a2)); //true,不一樣,為true
System.out.println("a2^a2="+(a2^a2)); //false,一樣,為fasle
System.out.println("a1&b1++==3="+(a1&++b1==3)); //true,a1為true,并且++b1此時為3,3==3位true,是以為true
System.out.println("b1="+b1); //b1=3
System.out.println("a2&&b2++==3="+(a2&&++b2==3));//false,a2為fasle,此時結果為fasle,後面的不在判斷,是以b2還是2
System.out.println("b2="+b2); //b2=2
}
}
a1&a2=false
a1|a2=true
a1&&a2=false
a1||a2=true
!a1=false
a1^a2=true
a2^a2=false
a1&b1++==3=true
b1=3
a2&&b2++==3=false
b2=2
位運算指的是進行二進制位的運算
舉例 | 解釋 | |||
---|---|---|---|---|
~ | 取反 | ~4 | -5 | (前面28個0)0100取反為(前面28個1)1011=-5,涉及符号位 |
& | 按位與 | 3&4 | (前面28個0)0011&(前面28個0)0100=(前面28個0)0000=0 | |
| | 按位或 | 3|4 | 7 | (前面28個0)0011|(前面28個0)0100=(前面28個0)0111=0 |
^ | 按位異或 | 3^4 | (前面28個0)0011^(前面28個0)0100=(前面28個0)0111=0 | |
>> | 右移運算符,右移一位相當于除2取商的整數部分 | 3>>1 | 1 | (前面28個0)0011>>1=(前面28個0)0001=1,3右移1位,相當于3/2取商=1.5,取商的整數部分就是1 |
<< | 左移運算符,左移一位相當于乘2 | 4<<2 | 16 | (前面28個0)0100<<2=(前面27個0)0000=16,4左移2位,相當于4*2*2=16 |
public class TestBitwiseOperators {
/**
* @param args
*/
public static void main(String[] args) {
int a = 3; //(前面28個0)0011=3
int b = 4; //(前面28個0)0100=4
int c = 0b11111111111111111111111111111011;
System.out.println("~a="+~a); //(前面28個1)1100=-4,涉及符号位
System.out.println("~b="+~b); //(前面28個1)1011=-5,涉及符号位
System.out.println("c="+c); //-5,涉及符号位
System.out.println("a&b="+(a&b)); //(前面28個0)0000=0
System.out.println("a|b="+(a|b)); //(前面28個0)0111=7
System.out.println("a^b="+(a^b)); //(前面28個0)0111=7
System.out.println("a>>1="+(a>>1)); //(前面28個0)0011>>1=(前面28個0)0001=1
System.out.println("b<<2="+(b<<2)); //(前面28個0)0100<<2=(前面27個0)0000=16
}
}
~a=-4
~b=-5
c=-5
a&b=0
a|b=7
a^b=7
a>>1=1
b<<2=16
文法格式:x?y:z
public class TestConditionalOperation {
/**
* @param args
*/
public static void main(String[] args) {
int a = 0;
int a2 = 2;
String string1 = a>0?"大于0":a==0?"等于0":"小于0";
String string2 = a2%2==0?"偶數":"奇數";
System.out.println(string1); //等于0
System.out.println(string2); //偶數
}
}
等于0
偶數
public class TestStringConnector {
/**
* @param args
*/
public static void main(String[] args) {
String a = "3";
int b = 4;
int c = 5;
System.out.print("a+b+c=");
System.out.println(a+b+c); //a+b+c="3"+4+5="34"+5="345"
System.out.print("b+c+a=");
System.out.print(b+c+a); //b+c+a=4+5+"3"=9+"3"="93"
}
}
a+b+c=345
b+c+a=93