天天看點

運算符(詳解與代碼)

作為一門計算機語言,肯定要涉及數學運算,運算離不開運算符,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