天天看點

趙雅智_java運算符與表達式

  • 運算符

運算符:用于标記對資料執行某種運算的特定符号 。

操作數:參加運算的資料稱為運算對象(操作數)。

分類

按運算符的功能 :算術運算符、關系運算符、邏輯運算符、位運算符等。

按參與運算的操作數的個數:單目運算符、雙目運算符、三目運算符。

  • 算數運算符:
  1. 單目運算符:+(1.計算 2.連接配接兩個字元串)、—、*、/、%(1.整數取模 2.小數取-->模判斷奇偶)
  2. 雙目運算符:+、-、++、--(++(--)運算符的操作數必須是變量)
  3. char類型的資料可以進行算術運算,
  4. boolean類型的資料不能進行算術運算。

自增自減運算符的使用

public class Testlncrement
{
	public static void main(String[] args)
	{
		int i = 9;
		int j;
		j = ++i;            //等價于 i=i+1;j=i;
		System.out.println("i=" + i + "\tj=" + j);
		j = i++;            //等價于 j=i;i=i+1;
		System.out.println("i=" + i + "\tj=" + j);
	}
}
           

輸出結果:i=10,j=10;i=11,j=10

  • 關系運算符

<、<=、>、>=、==、!=

判斷兩個操作數的等價性和大小關系,得到的結果為布爾類型。常用于邏輯判斷(if或循環)。

關系運算符的使用

public class TestComparison
{
	public static void main(String[],args)
	int a = 4;
	int b = 6;
	if(a == b)
		System.out.println("a 等于 b");
	if(a != b)
		System.out.println("a 不等于 b");
	if(a > b)
		System.out.println("a 大于 b");
	if(a < b)
		System.out.println("a 小于 b");
	if(a >= b)
		System.out.println("a 大于等于 b");
	if(a <= b)
		System.out.println("a 小于等于 b");
}
           
輸出結果:a不等于b,a小于b,a小于等于b。
  • 邏輯運算符
&、|、!、^(抑或,不同真相同假)、[&&、||提高效率]
a b ! a a & b a | b a ^ b a && b a || b
true true false true true false true true
true false false false true true false true
false true true false true true false true
false false true false false false false false
邏輯運算符的使用。
public class TestBooleanOperator
{
	public static void main(String[] args)
	{
		boolean b1,b2;
	b2 = false;
	b1 = ! b2;
	System.out.println("邏輯值:b1=" + b1 + ",b2=" + b2);
	System.out.println("邏輯與:b1 & b2=" + (b1 & b2);
	System.out.println("邏輯或:b1 | b2=" + (b1 | b2);
	System.out.println("邏輯抑或:b1 ^ b2=" + (b1 ^ b2)");

	int x=3,y=9;
	b1 = x > y && x ++ == y --;
	System.out.println("短路與的結果:" + b1 + ",x = "+ x +",y=" + y);

	x=3;
	y=9;
	b2 = x > y & x ++ == y --;
	System.out.println("邏輯與的結果:" + b1 + ",x = "+ x +",y=" + y);
	}
}
           

輸出結果:

邏輯值:b1=true,b2=false;

邏輯與:b1&b2=false;

邏輯或:b1|b2=true

邏輯抑或:b1^b2=true

短路與的結果:false,x=3,y=9

邏輯與的結果:false,x=4,y=8

  • 位運算符

&、|、^、>>、<<、>>>、~

位運算符用來對整型(byte、short、int、long)或字元型(char)資料二進制位進行操作,結果為一個整數。

負數:将絕對值取反+1

15: 00000000 00000000 00000000 00001111

-15:11111111 11111111 11111111 11110001

~ (按位取反) :将操作數a中的二進制位由1變0,由0變1。

& (按位相與) :兩個操作數的相應位都為1,則該位為1,否則為0。

>> (按位右移) :将a右移b位,右端的低位被舍棄,左端高位補原來的符号位。

<< (按位左移) :将a左移b位,右端的低位補0,左端的高位被舍棄。

>>>(無符号右移):将a右移b位,右端的低位被舍棄,左端的高位補0。

注意:移位運算時真正的移位位數不一定是指定的b位。

當a為int型(或byte、short、char型)時,系統會先将b對32取模,得到的結果才是真正移位的位數

而當a為long型時,系統先将b對64取模,得到的結果作為真正的移位位數。

public class TestBitwiseOPerator
{
	public static void main(String[] args)
	{
		int a = 9 & 12;               	9:1001
		int b = 9 | 12;		        12:1100	
		int c = 9 ^ 12;			&:1000   8	
		int d = ~12;			|:1101   13
		System.out.print("9 & 12 =" + a);	^:0101   5
		System.out.print("9 & 12 =" + b);	~:1100  
		System.out.print("9 & 12 =" + c);	   0011
		System.out.print("9 & 12 =" + d);	   0010
	}					   1101   -13
}
           
輸出結果:9 & 12 = 8,9 | 12 = 13,9 ^ 12 = 5,~ 12 = -13
public class TestMask
{
	public int getOneBit(int num,int n)//public static int getOneBit(int num,int n)
	{
		int i = 1 << (n - 1);
		int nb = num & i;
		return nb >> (n-1);
	}

	public static void main(String[] args)
	{
		int x = 9;
		TestMask obj = new TestMask();//
		System.out.print(obj.getOneBit(x,4));//System.out.println(TestMask.getOneBit(x,4));//System.out.println(getOneBit(x,4))
		System.out.print(obj.getOneBit(x,3));//System.out.println(TestMask.getOneBit(x,3));//System.out.println(getOneBit(x,3))
		System.out.print(obj.getOneBit(x,2));//System.out.println(TestMask.getOneBit(x,2));//System.out.println(getOneBit(x,2))
		System.out.println(obj.getOneBit(x,1));//System.out.println(TestMask.getOneBit(x,1));//System.out.println(getOneBit(x,1))
	}
}
           

輸出結果:1001

分析:方法getOneBit()可以傳回參數num的第n-1位。

  • 指派運算符

格式:變量(已聲明)=表達式 double d = 7.8f; //合法 int a = 78L; //非法 int a = (int)78L; //合法 10 = i + j;//非法 i + j = 10; //非

當指派運算符兩側的類型不一緻時,如果左側變量的資料類型的表示範圍更大,則把右側的資料自動轉換為與左側相同的資料類型,然後賦給左側變量

否則,需要使用強制類型轉換運算符。

複合的指派運算符 +=、-=、*=、/=、%=、&=、|=、^=、 >>=、 <<= 、>>>=

  • 條件運算符

    格式:表達式1 ? 表達式2 :表達式3(表達式1應是boolean類型的表達式;表達式2和表達式3的類型要一緻。)

import javax.swing.JOptionPane;
public class TestConditionalOpreator
{
	public static void main(String[] args)
	{
		int score;
		score = Integer.parseInt(JOpionPane.showInputDialog("請輸入百分制成績:"));
		String result = (score>=60)?"及格":"不及格";
		System.out.println(result);
	}
}
           

分析:

彈出輸入對話框,接收使用者輸入: JOptionPane.showInputDialog(s)

将數字的字元串表示形式轉換為整數:Integer.parseInt(s)

result = (score>=60) ? "及格" : "不及格"

  • 表達式

表達式:若幹操作數(operand)和運算符(operator)按照約定規則構成的一個序列。

運算符标明對操作數進行何種操作;

操作數可以是變量、常量或有傳回值的方法調用等其他的表達式。

運算符優先級和結合方向

優先級 運算符 操作數 結合方向
1 []、()
2 ++、--、+(單目)、-(單目)、~、!、(強制類型轉換)、new 單目 右-->左
3 *、/、% 雙目 左-->右
4 +、= 雙目 左-->右
5 <<、>>、>>> 雙目 左-->右
6 <、<=、>、>=、instanceof 雙目 左-->右
7 ==、!= 雙目 左-->右
8 & 雙目 左-->右
9 ^ 雙目 左-->右
10 | 雙目 左-->右
11 && 雙目 左-->右
12 || 雙目 左-->右
13 ?: 三目 右-->左
14 =、+=、-=、*=、/=、^=、%=、&=、|=、<<=、>>=、>>>= 雙目 右-->左
  • 表達式中的資料類型轉換
  1. 自動類型轉換

    為了保證精度,轉換從表示數的範圍較小的資料類型到表示數的範圍較大的資料類型。

    (byte或short)和 int-->int

    (byte或short或int)和 long-->long

    (byte或short或int或long)和 float-->float

    (byte或short或int或long或float)和 double-->double

    char和int-->int

    箭頭左邊表示參與運算的資料類型,操作可以是算術運算、指派運算等,箭頭右邊轉換後進行運作的資料類型

    long longVar = 12345; double doubleVar = 1.2f;

    float f = 23456434563L;

    doubleVar = doubleVar * (12 + longVar);

    int a=doubleVar/100; //錯,需使用強制類型轉換

    注意:布爾類型不能與任何其它資料類型轉換。

  2. 強制類型轉換

    (目标資料類型)變量或表達式 float)5 / 9 * (f - 32)

    注意:強制類型轉換時,由于目标資料類型的取值範圍小于待轉換資料類型的取值範圍,在轉換過程中會出現截斷,導緻高位資料丢失或精度下降。

public class TypeConversion
{
	public static void main(String[],args)
	{
		int intVar = Oxff56;
		byte byteVar = (byte)intVar;
		System.out.println("intVar=" + Integer.toString(intVar,2) + ";" + intVar);
		System.out.println("byteVar=" + Integer.toString(byteVar,2) + ";" + intVar);
	}
}
           

結果:intVar=1111111101010110;65366;

byteVar=1010110;86;

将32位整數65366強制轉換為byte型後,整數的高位被截掉,隻剩下低8位,位元組資料為86,導緻資料丢失。

數值的類型轉換。

public class TypeConversion
{
	public static void main(String[],args)
	{
		int i1 = 1234567891;
		float f = i1;			//合法,但任然可能存在精度損失
		System.out.println(f);
		double d1 = i1;			//合法,不存在精度損失
		System.out.println(d1);

		double d2 = 3.99;
		int i2 = (int)d2;
		System.out.println(i2);

		byte a = 37;			//合法
		byte b = 112;			//合法
		//byte c = 200;			//非法,超出範圍
		//byte d = a + b;		//非法,可能存在精度損失
		int e = a + b;
		System.out.println(e);

		int k = 12;
		//byte b1 = k;			//非法,可能存在精度損失
	}
}
           

結果:1.23456794E9

1.234567891E9

3

149