Unit6 運算符與表達式
1、運算符 2、表達式 3、語句
程式是由許多語句組成,而語句組成的基本機關就是表達式與運算符。Java中的運算符主要分為4類:算術運算符、關系運算符、邏輯運算符和位運算符。
運算符:進行運算符的符号。
表達式:運算符+操作數。
1 運算符
1.1 指派運算符
為不同類型的變量指派,就需要用到指派運算符“=”,将等号右邊的值賦給等号左邊的變量,注意:指派的資料類型要左右一緻或左側接收值變量的類型等級要比值類型的等級高。
//指派運算符
int num = 100 ;//将100指派給int類型的num變量
byte num2 = 100 ; //将100指派給byte類型的num2變量
num= num2;//雖然不是一類型,但是num變量表示範圍比num2範圍大,是以可以接收num2的值
1.2 一進制運算符
使用一個運算符完成對操作數本身的運算,稱為一進制運算符。
l +:正号
num3 = +num3;//+正号,值為4
l -:負号
num3 = -num3;//-:負号值為-4
l !:NOT 非
boolean boo = !true; //!:取反 NOT 非 值為false 隻能操作boolean類型
num3 = !num3;//使用在int類型上報錯
l ~:對補碼按位取反
byte num4 = 4;
num4 = (byte)~num4;//4的原碼為:0000 0100 補碼與原碼一樣然後按位取反:1111 1011 值為-5 為什麼對補碼取反?
在計算機中,存儲的資料是二進制格式,負數是以補碼的形式存儲。是以任何負數的位運算,都是對補碼的運算。
l ++:自增,對自身的值+1
/*
* 在對數值進行操作時(包括指派運算、列印操作、傳參操作),自增符号++在前時,
*先對數值本身進行+1操作,再執行其他操作,++在後時,先執行其他操作,再對數值本身進行+1操作
*/
byte num5 = 10;
num5 = num5++;
System.out.println(num5);//列印結果為10
byte num6 = 10;
num6 = ++num6;
System.out.println(num6);//列印結果為11
l --:自減
/*
* 在對數值進行操作時(包括指派運算、列印操作、傳參操作),自減符号--在前時,
*先對數值本身進行-1操作,再執行其他操作,--在後時,先執行其他操作,再對數值本身進行-1操作
*/
byte num7 = 10;
num7 = num7--;
System.out.println(num7);//列印結果為10
byte num8 = 10;
num8 = --num8;
System.out.println(num8);//列印結果為9
l 注意事項:
byte num9 = 10;
num9 = num9 +1;//報錯,因為num9是byte類型,1是整數類型,需要強制轉換一下
num9= num9++;//不報錯,是因為是在其本身進行一個自我的遞增操作,java底層代碼内部實作
1.3 算術運算符
數值與數值之間的基本運算:+、-、*、/、%。
//算術運算符
int num10 = 10;
num10 = num10+ 10;//這裡的"+"表示加法運算。
System.out.println("結果為:"+num10);//列印結果20,+字元串與數字連接配接表示連接配接符,連接配接的數字被轉為字元串。
int num11 = 10;
num11 = num11- 10;//這裡的"-"表示減法運算。
System.out.println("結果為:"+num11);//列印結果0
int num12 = 10;
num12 = num12* 10;//這裡的"*"表示乘法運算。
System.out.println("結果為:"+num12);//列印結果100
int num13 = 13;
num13 = num13/ 10;//這裡的"/"表示除法運算,如果是整數類型運算,就是整除。需要保留小數位,則将參與運算的操作數轉為浮點型,并且以浮點型變量來接收。
num3 = numf / num2;
System.out.println("結果為:"+num13);//列印結果3
int num14 = 14;
num14 = num14% 10;//這裡的"%"表示取餘數運算。通過判斷運算結果,可以知道一個是是否可以被另一個數整除
System.out.println("結果為:"+num14);//列印結果4
//注意,當進行除法時,需要保留小數位,運算式中,必須有浮點型資料參與運算。
float num15 = (float)num15/4;//int類型14除以浮點型4,自動将結果轉為浮點型,或者使用強制轉換
System.out.println(num15);//列印結果:3.75
float num16 = 4 * 4;//當進行乘法運算時,int類型的結果可以自動轉為float類型
System.out.println(num16);//列印結果16.0
float num17 = 15.15f;//如果不包含小數位以後的數字,那麼寫不寫f都可以,為什麼??
System.out.println(num17 % 10);//結果為5.1499996,浮點型也可以進行取餘數運算
1.4 邏輯運算符
邏輯運算符隻對boolean資料類型操作數進行運算,參與運算的資料與傳回的資料類型都是boolean類型。(true或false)
&、&&:“與”運算符兩邊值都是true,結果則為true。(真真為真)
|、||:“或”運算符兩邊有一個值為true,結果則為true。(有真則真)
!:“非”運算符,對資料值進行取反。
//&、&&真真為真
System.out.println(true&true);//true
System.out.println(true&false);//false
System.out.println(false&false);//false
System.out.println(true&&true);//true
System.out.println(true&&false);//false
System.out.println(false&&false);//false
//|、||有真則真
System.out.println(true|true);//true
System.out.println(true|false);//true
System.out.println(false|false);//false
System.out.println(true||true);//true
System.out.println(true||false);//true
System.out.println(false||false);//false
//取反
System.out.println(!true);//false
&&、||和&、|的差別:當使用這兩個運算符運算時,當運算符左邊的結果已經起到決定性作用時,就不會再去判斷運算符右側的數值。
//&&、||的差別:
int num18 = 10;
int num19 = 20;
boolean boo1 = ++num18==18&--num19==19;//當num18==18結果已經為flase時候,還會去執行右邊的操作
System.out.println("結果"+boo1+"---num18的值為:"+num18+"----num19的值為:"+num19);
int num20 = 10;
int num21 = 20;
boolean boo2 =++num20==20&&--num21==19;//當num==20結果已經為flase時候,就不再去執行右邊的操作
System.out.println("結果"+boo2+"---num20的值為:"+num20+"----num21的值為:"+num21);
int num22 = 10;
int num23 = 20;
boolean boo3 =++num22==11|--num23==19;//當num22==11結果已經為true時候,還會去執行右邊的操作
System.out.println("結果"+boo3+"---num22的值為:"+num22+"----num23的值為:"+num23);
int num24 = 10;
int num25 = 20;
boolean boo4 =++num24==11||--num25==19;//當num24==11結果已經為ture時候,就不再去執行右邊的操作
System.out.println("結果"+boo4+"---num24的值為:"+num24+"----num25的值為:"+num25);
1.5 位運算符
對操作數的二進制資料的補碼按位進行運算操作。
l >>:右移;
//位運算
//>>:右移
int num26 = 16;
System.out.println(num26>>1);//結果:8
System.out.println(num26>>2);//結果:4
System.out.println(num26>>3);//結果:2
System.out.println(num26>>4);//結果:1
System.out.println(num26>>5);//結果:0
/*
*規律:向右每移動一位相當于在上一次一動基礎上除以2,右移n次為:num26/2^n,空出來的部分正數補0,負數補1
*代碼分析:
*16:0000 0000 0000 0000 0000 0000 0001 0000 向右移動2位:0000 0000 0000 0000 0000 0000 0000 0010 結果為4
*思考:負數右移結果?
*-16>>2=? 1000 0000 0000 0000 0000 00000001 0000 向右一動2位:0010 00000000 0000 0000 0000 0000 0010 結果為:536,870,914
*應該按照存儲的資料來運算,即補碼運算:1111 1111 1111 1111 1111 1111 1111 0000 向右移動2位:1111 1111 1111 1111 1111 1111 1111 1100
*/
System.out.println(-16>>2);//結果為:-4 1111 1111 1111 1111 1111 1111 1111 1100
l <<左移;
//<<:左移
int num27 = 3;
System.out.println(num27<< 1);//結果:6
System.out.println(num27<< 2);//結果:12
System.out.println(num27<< 3);//結果:24
System.out.println(num27<< 4);//結果:48
System.out.println(num27<< 5);//結果:96
//規律:向左移動一位,相當于在原有的基礎上乘以2,高位抛棄,低位補0,左移n次為:num27*2^n
System.out.println(-3<< 2);//結果為:-12 11111111111111111111111111110100
l >>>:無符号右移;
//無符号右移,高位補零,低位舍去
//也就是說,正數無符号右移和正數的右移是一樣的
//越大的負數的無符号右移是一個越大的正數
int num28 = -16;
System.out.println(-4>>> 2);//變為正數
System.out.println(8>>> 2);//與右移一緻
l &:與 AND;
//&:與運算,兩個二進制數按位運算,都為1,則該位結果為1,否則為0(一一得一)
System.out.println(5 &6);//0000 0101 & 0000 0110 = 0000 0100 結果為:4
l |:或 OR;
//|:或運算,兩個二進制數按位運算,有1,則為1,都為0,才是0 (有一得一)
System.out.println(5 | 6);//0000 0101 | 0000 0110 = 0000 0111結果為:7
l ^:異或 XOR;
//^:異或運算,兩個二進制數按位運算,不一樣,則為1,一樣則為0(一零得一)
System.out.println(5 ^ 6);//0000 0101 ^ 0000 0110 = 0000 0011結果為:3
//一個數,異或一個數字兩次,還是原來的數字。
l ~:按位取反 NOT。
//~:取反運算,按位取反
System.out.println(~4);//0000 0000 0000 0000 0000 0000 0000 0100 取反:1111 1111 1111 1111 1111 1111 1111 1011 值為 -5
System.out.println(~-4);//:1111 11111111 1111 1111 1111 1111 1100 取反:0000 0000 0000 0000 0000 0000 0000 0011 值為3
1.6 三元運算符
又稱三目運算符:結果 = 表達式 ?結果1:結果2
結果可以是任意類型,表達式成立傳回結果1,不成立傳回結果2。
//三目運算符
int num29 = 5;
int num30 = 5;
int num31 = num29 >num30 ?num29 :num30;//num29大于num30表達式成立,傳回num29,不成立傳回num30
System.out.println(num31);//結果為5
String str1 =num29 > num30 ?"num29比num30大":"num29沒有num30大";//條件成立傳回值1,不成立傳回值2
//三目運算符的嵌套
str1 = num29> num30 ?"num29比num30大":num29 == num30 ?"num29與num30相等":"num30比num29大";
System.out.println(str1);
1.7 關系運算符與if語句
使用關系運算符對資料進行判斷運算,傳回布爾類型值。
//關系運算符
System.out.println(1 > 2);//false
System.out.println(1 < 2);//true
System.out.println(1 != 2);//true
System.out.println(1 >=2);//false
System.out.println(1 <=1);//true
System.out.println("aaa"=="aaa");//true,字元串可以使用==進行内容判斷
If語句
使用if語句進行條件判斷,判斷的結果為boolean類型值。
if(條件){代碼}
當運算結果為true時,執行if後面代碼塊的代碼
if (num29 > num30){
System.out.println("if語句成立,num29比num30大");
}
1.8 遞增與遞減運算符
++:自增;--:自減。
1.9 括号運算符
使用()來對運算順序進行控制。
//括号運算符
System.out.println((1+2)*3);//結果為9
System.out.println(1+2*3);//結果為7
1.10 運算符的優先級
實際中沒有必要死死的遵守這個順序,一般遇到多個運算符直接使用()進行順序控制即可。
1.11 指派運算符
//指派運算符
int num32 = 32;//普通指派運算符
num32 -= 1;//簡寫的指派運算符,結果為31
System.out.println(num32);
2 表達式
2.1 算術表達式
用于數值計算。由算術運算符和操作數組成。
//算術表達式
int num33 = 2 * 8;
2.2 關系表達式
用于程式判斷語句中,由關系運算符組成,傳回一個布爾類型值。
//關系表達式
if (1 < 2) {
System.out.println("輸出代碼");
}
2.3 邏輯表達式
使用邏輯運算符進行運算,傳回一個布爾類型值。
//邏輯表達式
System.out.println(true & true);
2.4 指派表達式
由指派運算符和操作數組成,用于給變量指派。
//指派表達式
int num34 = num33;
3 語句
3.1 語句中的空格
代碼中,語句中的空格不會影響代碼的執行。可以使用空格分隔運算符,便于閱讀。
Int num33 = 2 * 8;
3.2 空語句
代碼中,什麼都不寫或者使用;來表示一行代碼,也可以運作成功。
if (1 < 2) {
}
3.3 聲明語句
基本資料類型變量的聲明:資料類型 變量名 = 值;
引用資料類型變量的聲明:資料類型 變量名 = new 資料類型();
3.4 指派語句
使用 = 進行對變量的指派操作。
4 練習
做一個電腦,可以進行普通運算、以及位運算。
普通計算:加減乘除取餘;
位運算:輸入位運算的資料,傳回位運算的二進制表現形式。
下面是我練習的代碼:
package day06;
public class Operator {
public static void main(String[] args) {
//指派運算符
int num = 100 ;//将100指派給int類型的num變量
byte num2 = 100 ; //将100指派給byte類型的num2變量
num = num2;//雖然不是一類型,但是num變量表示範圍比num2範圍大,是以可以接收num2的值
//一進制運算符
int num3 = 4;
num3 = +num3;//+正号,值為4
num3 = -num3;//-:負号 值為-4
boolean boo = !true; //!:取反 NOT 非 值為false 隻能操作boolean類型
//num3 = !num3;//使用在int類型上報錯
byte num4 = 4;
num4 = (byte)~num4;//4的原碼為:0000 0100 補碼與原碼一樣 然後按位取反:1111 1011 值為-5,為什麼對補碼取反?
/*
* 在對數值進行操作時(包括指派運算、列印操作、傳參操作),自增符号++在前時,
*先對數值本身進行+1操作,再執行其他操作,++在後時,先執行其他操作,再對數值本身進行+1操作
*/
byte num5 = 10;
num5 = num5++;
System.out.println(num5);//列印結果為10
byte num6 = 10;
num6 = ++num6;
System.out.println(num6);//列印結果為11
/*
* 在對數值進行操作時(包括指派運算、列印操作、傳參操作),自減符号--在前時,
*先對數值本身進行-1操作,再執行其他操作,--在後時,先執行其他操作,再對數值本身進行-1操作
*/
byte num7 = 10;
num7 = num7--;
System.out.println(num7);//列印結果為10
byte num8 = 10;
num8 = --num8;
System.out.println(num8);//列印結果為9
byte num9 = 10;
//num9 = num9 +1 //報錯,因為num8是byte類型,1是整數類型,需要強制轉換一下
num9 = num9++;//不報錯,是因為是在其本身進行一個自我的遞增操作,java底層代碼内部實作
//算術運算符
int num10 = 10;
num10 = num10 + 10;//這裡的"+"表示加法運算。
System.out.println("結果為:"+num10);//列印結果20,字元串與數字連接配接表示連接配接符,連接配接的數字被轉為字元串。
int num11 = 10;
num11 = num11 - 10;//這裡的"-"表示減法運算。
System.out.println("結果為:"+num11);//列印結果0
int num12 = 10;
num12 = num12 * 10;//這裡的"*"表示乘法運算。
System.out.println("結果為:"+num12);//列印結果100
int num13 = 13;
num13 = num13 / 10;//這裡的"/"表示除法運算。
System.out.println("結果為:"+num13);//列印結果3
int num14 = 14;
num14 = num14 % 10;//這裡的"%"表示取餘數運算。通過判斷運算結果,可以知道一個是是否可以被另一個數整除
System.out.println("結果為:"+num14);//列印結果4
//注意,當進行除法時,需要保留小數位,運算式中,必須有浮點型資料參與運算。
float num15 = 15/4f;//int類型14除以浮點型4,自動将結果轉為浮點型,或者使用強制轉換
System.out.println(num15);//列印結果:3.75
float num16 = 4 * 4;//當進行乘法運算時,int類型的結果可以自動轉為float類型
System.out.println(num16);//列印結果16.0
float num17 = 15.15f;//如果不包含小數位以後的數字,那麼寫不寫f都可以,為什麼??
System.out.println(num17 % 10);//結果為5.1499996,浮點型也可以進行取餘數運算
//邏輯運算符:
//&、&&真真為真
System.out.println(true&true);//true
System.out.println(true&false);//false
System.out.println(false&false);//false
System.out.println(true&&true);//true
System.out.println(true&&false);//false
System.out.println(false&&false);//false
//|、||有真則真
System.out.println(true|true);//true
System.out.println(true|false);//true
System.out.println(false|false);//false
System.out.println(true||true);//true
System.out.println(true||false);//true
System.out.println(false||false);//false
//取反
System.out.println(!true);//false
//&&、||的差別:
int num18 = 10;
int num19 = 20;
boolean boo1 = ++num18==18&--num19==19;//當num18==18結果已經為flase時候,還會去執行右邊的操作
System.out.println("結果"+boo1+"---num18的值為:"+num18+"----num19的值為:"+num19);
int num20 = 10;
int num21 = 20;
boolean boo2 = ++num20==20&&--num21==19;//當num==20結果已經為flase時候,就不再去執行右邊的操作
System.out.println("結果"+boo2+"---num20的值為:"+num20+"----num21的值為:"+num21);
int num22 = 10;
int num23 = 20;
boolean boo3 = ++num22==11|--num23==19;//當num22==11結果已經為true時候,還會去執行右邊的操作
System.out.println("結果"+boo3+"---num22的值為:"+num22+"----num23的值為:"+num23);
int num24 = 10;
int num25 = 20;
boolean boo4 = ++num24==11||--num25==19;//當num24==11結果已經為ture時候,就不再去執行右邊的操作
System.out.println("結果"+boo4+"---num24的值為:"+num24+"----num25的值為:"+num25);
//位運算
//>>:右移
int num26 = 16;
System.out.println(num26>>1);//結果:8
System.out.println(num26>>2);//結果:4
System.out.println(num26>>3);//結果:2
System.out.println(num26>>4);//結果:1
System.out.println(num26>>5);//結果:0
/*
*規律:向右每移動一位相當于在上一次一動基礎上除以2,右移n次為:num26/2^n,空出來的部分整數補0,負數補1
*代碼分析:
*16:0000 0000 0000 0000 0000 0000 0001 0000 向右移動2位:0000 0000 0000 0000 0000 0000 0000 0010 結果為4
*思考:負數右移結果?
*-16>>2=? 1000 0000 0000 0000 0000 0000 0001 0000 向右一動2位:0010 0000 0000 0000 0000 0000 0000 0010 結果為:536,870,914
*應該按照存儲的資料來運算,即補碼運算:1111 1111 1111 1111 1111 1111 1111 0000 向右移動2位:1111 1111 1111 1111 1111 1111 1111 1100
*/
System.out.println(-16>>2);//結果為:-4 1111 1111 1111 1111 1111 1111 1111 1100
//<<:左移
int num27 = 3;
System.out.println(num27 << 1);//結果:6
System.out.println(num27 << 2);//結果:12
System.out.println(num27 << 3);//結果:24
System.out.println(num27 << 4);//結果:48
System.out.println(num27 << 5);//結果:96
//規律:向左移動一位,相當于在原有的基礎上乘以2,高位抛棄,低位補0,左移n次為:num27*2^n
System.out.println(-3 << 2);//結果為:-12 11111111111111111111111111110100
//無符号右移,高位補零,低位舍去
int num28 = -16;
System.out.println(-4 >>> 2);//變為正數
System.out.println(8 >>> 2);//與右移一緻
//&:與運算,兩個二進制數按位運算,都為1,則該位結果為1,否則為0(一一得一)
System.out.println(5 & 6);//0000 0101 & 0000 0110 = 0000 0100 結果為:4
//|:或運算,兩個二進制數按位運算,有1,則為1,都為0,才是0 (有一得一)
System.out.println(5 | 6);//0000 0101 | 0000 0110 = 0000 0111結果為:7
//^:異或運算,兩個二進制數按位運算,不一樣,則為1,一樣則為0(一零得一)
System.out.println(5 ^ 6);//0000 0101 ^ 0000 0110 = 0000 0011結果為:3
//~:取反運算,按位取反
System.out.println(~4);//0000 0000 0000 0000 0000 0000 0000 0100 取反:1111 1111 1111 1111 1111 1111 1111 1011 值為 -5
System.out.println(~-4);//:1111 1111 1111 1111 1111 1111 1111 1100 取反:0000 0000 0000 0000 0000 0000 0000 0011 值為3
//三目運算符
int num29 = 51;
int num30 = 5;
int num31 = num29 > num30 ?num29 :num30;//num29大于num30表達式成立,傳回num29,不成立傳回num30
System.out.println(num31);//結果為5
String str1 = num29 > num30 ?"num29比num30大":"num29沒有num30大";//條件成立傳回值1,不成立傳回值2
//三目運算符的嵌套
str1 = num29 > num30 ?"num29比num30大":num29 == num30 ?"num29與num30相等":"num30比num29大";
System.out.println(str1);
//關系運算符
System.out.println(1 > 2);//false
System.out.println(1 < 2);//true
System.out.println(1 != 2);//true
System.out.println(1 >= 2);//false
System.out.println(1 <= 1);//true
System.out.println("aaa"=="aaa");//true,字元串可以使用==進行内容判斷
if (num29 > num30) {
System.out.println("if語句成立,num29比num30大");
}
//括号運算符
System.out.println((1+2)*3);//結果為9
System.out.println(1+2*3);//結果為7
//指派運算符
int num32 = 32;//普通指派運算符
num32 -= 1;//簡寫的指派運算符,結果為31
System.out.println(num32);
//算術表達式
int num33 = 2 * 8;
//關系表達式
if (1 < 2) {
System.out.println("輸出代碼");
}
//邏輯表達式
System.out.println(true & true);
//指派表達式
int num34 = num33;
}
}