程序是由許多語句組成,而語句組成的基本單位就是表達式與運算符。java中的運算符主要分為4類:算術運算符、關系運算符、邏輯運算符和位運算符。
運算符:進行運算符的符號。
表達式:運算符+操作數(shù)。
為不同類型的變量賦值,就需要用到賦值運算符“=”,將等號右邊的值賦給等號左邊的變量,注意:賦值的數(shù)據(jù)類型要左右一致或左側(cè)接收值變量的類型等級要比值類型的等級高。
//賦值運算符 int num = 100 ;//將100賦值給int類型的num變量 byte num2 = 100 ; //將100賦值給byte類型的num2變量 num= num2;//雖然不是一類型,但是num變量表示范圍比num2范圍大,所以可以接收num2的值1.2 一元運算符
使用一個運算符完成對操作數(shù)本身的運算,稱為一元運算符。
l +:正號
num3 = +num3;//+正號,值為4l -:負號
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 為什么對補碼取反? 在計算機中,存儲的數(shù)據(jù)是二進制格式,負數(shù)是以補碼的形式存儲。所以任何負數(shù)的位運算,都是對補碼的運算。l ++:自增,對自身的值+1
/* * 在對數(shù)值進行操作時(包括賦值運算、打印操作、傳參操作),自增符號++在前時, *先對數(shù)值本身進行+1操作,再執(zhí)行其他操作,++在后時,先執(zhí)行其他操作,再對數(shù)值本身進行+1操作 */ byte num5 = 10; num5 = num5++; System.out.PRintln(num5);//打印結果為10 byte num6 = 10; num6 = ++num6; System.out.println(num6);//打印結果為11
l --:自減
/* * 在對數(shù)值進行操作時(包括賦值運算、打印操作、傳參操作),自減符號--在前時, *先對數(shù)值本身進行-1操作,再執(zhí)行其他操作,--在后時,先執(zhí)行其他操作,再對數(shù)值本身進行-1操作 */ byte num7 = 10; num7 = num7--; System.out.println(num7);//打印結果為10 byte num8 = 10; num8 = --num8; System.out.println(num8);//打印結果為9l 注意事項:
byte num9 = 10; num9 = num9 +1;//報錯,因為num9是byte類型,1是整數(shù)類型,需要強制轉(zhuǎn)換一下 num9= num9++;//不報錯,是因為是在其本身進行一個自我的遞增操作,java底層代碼內(nèi)部實現(xiàn)1.3 算術運算符
數(shù)值與數(shù)值之間的基本運算:+、-、*、/、%。
//算術運算符 int num10 = 10; num10 = num10+ 10;//這里的"+"表示加法運算。 System.out.println("結果為:"+num10);//打印結果20,+字符串與數(shù)字連接表示連接符,連接的數(shù)字被轉(zhuǎn)為字符串。 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;//這里的"/"表示除法運算,如果是整數(shù)類型運算,就是整除。需要保留小數(shù)位,則將參與運算的操作數(shù)轉(zhuǎn)為浮點型,并且以浮點型變量來接收。 num3 = numf / num2; System.out.println("結果為:"+num13);//打印結果3 int num14 = 14; num14 = num14% 10;//這里的"%"表示取余數(shù)運算。通過判斷運算結果,可以知道一個是是否可以被另一個數(shù)整除 System.out.println("結果為:"+num14);//打印結果4 //注意,當進行除法時,需要保留小數(shù)位,運算式中,必須有浮點型數(shù)據(jù)參與運算。 float num15 = (float)num15/4;//int類型14除以浮點型4,自動將結果轉(zhuǎn)為浮點型,或者使用強制轉(zhuǎn)換 System.out.println(num15);//打印結果:3.75 float num16 = 4 * 4;//當進行乘法運算時,int類型的結果可以自動轉(zhuǎn)為float類型 System.out.println(num16);//打印結果16.0 float num17 = 15.15f;//如果不包含小數(shù)位以后的數(shù)字,那么寫不寫f都可以,為什么?? System.out.println(num17 % 10);//結果為5.1499996,浮點型也可以進行取余數(shù)運算
1.4 邏輯運算符
邏輯運算符只對boolean數(shù)據(jù)類型操作數(shù)進行運算,參與運算的數(shù)據(jù)與返回的數(shù)據(jù)類型都是boolean類型。(true或false)
&、&&:“與”運算符兩邊值都是true,結果則為true。(真真為真)
|、||:“或”運算符兩邊有一個值為true,結果則為true。(有真則真)
!:“非”運算符,對數(shù)據(jù)值進行取反。
//&、&&真真為真 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&&、||和&、|的區(qū)別:當使用這兩個運算符運算時,當運算符左邊的結果已經(jīng)起到?jīng)Q定性作用時,就不會再去判斷運算符右側(cè)的數(shù)值。
//&&、||的區(qū)別: int num18 = 10; int num19 = 20; boolean boo1 = ++num18==18&--num19==19;//當num18==18結果已經(jīng)為flase時候,還會去執(zhí)行右邊的操作 System.out.println("結果"+boo1+"---num18的值為:"+num18+"----num19的值為:"+num19); int num20 = 10; int num21 = 20; boolean boo2 =++num20==20&&--num21==19;//當num==20結果已經(jīng)為flase時候,就不再去執(zhí)行右邊的操作 System.out.println("結果"+boo2+"---num20的值為:"+num20+"----num21的值為:"+num21); int num22 = 10; int num23 = 20; boolean boo3 =++num22==11|--num23==19;//當num22==11結果已經(jīng)為true時候,還會去執(zhí)行右邊的操作 System.out.println("結果"+boo3+"---num22的值為:"+num22+"----num23的值為:"+num23); int num24 = 10; int num25 = 20; boolean boo4 =++num24==11||--num25==19;//當num24==11結果已經(jīng)為ture時候,就不再去執(zhí)行右邊的操作 System.out.println("結果"+boo4+"---num24的值為:"+num24+"----num25的值為:"+num25);1.5 位運算符
對操作數(shù)的二進制數(shù)據(jù)的補碼按位進行運算操作。
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 /* *規(guī)律:向右每移動一位相當于在上一次一動基礎上除以2,右移n次為:num26/2^n,空出來的部分正數(shù)補0,負數(shù)補1 *代碼分析: *16:0000 0000 0000 0000 0000 0000 0001 0000 向右移動2位:0000 0000 0000 0000 0000 0000 0000 0010 結果為4 *思考:負數(shù)右移結果? *-16>>2=? 1000 0000 0000 0000 0000 00000001 0000 向右一動2位:0010 00000000 0000 0000 0000 0000 0010 結果為:536,870,914 *應該按照存儲的數(shù)據(jù)來運算,即補碼運算: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 1100l <<左移;
//<<:左移 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 //規(guī)律:向左移動一位,相當于在原有的基礎上乘以2,高位拋棄,低位補0,左移n次為:num27*2^n System.out.println(-3<< 2);//結果為:-12 11111111111111111111111111110100
l >>>:無符號右移;
//無符號右移,高位補零,低位舍去 //也就是說,正數(shù)無符號右移和正數(shù)的右移是一樣的 //越大的負數(shù)的無符號右移是一個越大的正數(shù) int num28 = -16; System.out.println(-4>>> 2);//變?yōu)檎龜?shù) System.out.println(8>>> 2);//與右移一致
l &:與 AND;
//&:與運算,兩個二進制數(shù)按位運算,都為1,則該位結果為1,否則為0(一一得一) System.out.println(5 &6);//0000 0101 & 0000 0110 = 0000 0100 結果為:4l |:或 OR;
//|:或運算,兩個二進制數(shù)按位運算,有1,則為1,都為0,才是0 (有一得一) System.out.println(5 | 6);//0000 0101 | 0000 0110 = 0000 0111結果為:7l ^:異或 XOR;
//^:異或運算,兩個二進制數(shù)按位運算,不一樣,則為1,一樣則為0(一零得一) System.out.println(5 ^ 6);//0000 0101 ^ 0000 0110 = 0000 0011結果為:3 //一個數(shù),異或一個數(shù)字兩次,還是原來的數(shù)字。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語句
使用關系運算符對數(shù)據(jù)進行判斷運算,返回布爾類型值。
//關系運算符 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,字符串可以使用==進行內(nèi)容判斷
If語句
使用if語句進行條件判斷,判斷的結果為boolean類型值。
if(條件){代碼}
當運算結果為true時,執(zhí)行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);//結果為71.10 運算符的優(yōu)先級
實際中沒有必要死死的遵守這個順序,一般遇到多個運算符直接使用()進行順序控制即可。
1.11 賦值運算符
//賦值運算符 int num32 = 32;//普通賦值運算符 num32 -= 1;//簡寫的賦值運算符,結果為31 System.out.println(num32);2 表達式
2.1 算術表達式
用于數(shù)值計算。由算術運算符和操作數(shù)組成。
//算術表達式 int num33 = 2 * 8;2.2 關系表達式
用于程序判斷語句中,由關系運算符組成,返回一個布爾類型值。
//關系表達式 if (1 < 2) { System.out.println("輸出代碼"); }2.3 邏輯表達式
使用邏輯運算符進行運算,返回一個布爾類型值。
//邏輯表達式 System.out.println(true & true);2.4 賦值表達式
由賦值運算符和操作數(shù)組成,用于給變量賦值。
//賦值表達式 int num34 = num33;3 語句
3.1 語句中的空格
代碼中,語句中的空格不會影響代碼的執(zhí)行。可以使用空格分隔運算符,便于閱讀。
Int num33 = 2 * 8;3.2 空語句
代碼中,什么都不寫或者使用;來表示一行代碼,也可以運行成功。
if (1 < 2) { }
3.3 聲明語句
基本數(shù)據(jù)類型變量的聲明:數(shù)據(jù)類型 變量名 = 值;
引用數(shù)據(jù)類型變量的聲明:數(shù)據(jù)類型 變量名 = new 數(shù)據(jù)類型();
3.4 賦值語句
使用 = 進行對變量的賦值操作。
4 練習
做一個計算器,可以進行普通運算、以及位運算。
普通計算:加減乘除取余;
位運算:輸入位運算的數(shù)據(jù),返回位運算的二進制表現(xiàn)形式。
下面是我練習的代碼:
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,為什么對補碼取反? /* * 在對數(shù)值進行操作時(包括賦值運算、打印操作、傳參操作),自增符號++在前時, *先對數(shù)值本身進行+1操作,再執(zhí)行其他操作,++在后時,先執(zhí)行其他操作,再對數(shù)值本身進行+1操作 */ byte num5 = 10; num5 = num5++; System.out.println(num5);//打印結果為10 byte num6 = 10; num6 = ++num6; System.out.println(num6);//打印結果為11 /* * 在對數(shù)值進行操作時(包括賦值運算、打印操作、傳參操作),自減符號--在前時, *先對數(shù)值本身進行-1操作,再執(zhí)行其他操作,--在后時,先執(zhí)行其他操作,再對數(shù)值本身進行-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是整數(shù)類型,需要強制轉(zhuǎn)換一下 num9 = num9++;//不報錯,是因為是在其本身進行一個自我的遞增操作,java底層代碼內(nèi)部實現(xiàn) //算術運算符 int num10 = 10; num10 = num10 + 10;//這里的"+"表示加法運算。 System.out.println("結果為:"+num10);//打印結果20,字符串與數(shù)字連接表示連接符,連接的數(shù)字被轉(zhuǎn)為字符串。 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;//這里的"%"表示取余數(shù)運算。通過判斷運算結果,可以知道一個是是否可以被另一個數(shù)整除 System.out.println("結果為:"+num14);//打印結果4 //注意,當進行除法時,需要保留小數(shù)位,運算式中,必須有浮點型數(shù)據(jù)參與運算。 float num15 = 15/4f;//int類型14除以浮點型4,自動將結果轉(zhuǎn)為浮點型,或者使用強制轉(zhuǎn)換 System.out.println(num15);//打印結果:3.75 float num16 = 4 * 4;//當進行乘法運算時,int類型的結果可以自動轉(zhuǎn)為float類型 System.out.println(num16);//打印結果16.0 float num17 = 15.15f;//如果不包含小數(shù)位以后的數(shù)字,那么寫不寫f都可以,為什么?? System.out.println(num17 % 10);//結果為5.1499996,浮點型也可以進行取余數(shù)運算 //邏輯運算符: //&、&&真真為真 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 //&&、||的區(qū)別: int num18 = 10; int num19 = 20; boolean boo1 = ++num18==18&--num19==19;//當num18==18結果已經(jīng)為flase時候,還會去執(zhí)行右邊的操作 System.out.println("結果"+boo1+"---num18的值為:"+num18+"----num19的值為:"+num19); int num20 = 10; int num21 = 20; boolean boo2 = ++num20==20&&--num21==19;//當num==20結果已經(jīng)為flase時候,就不再去執(zhí)行右邊的操作 System.out.println("結果"+boo2+"---num20的值為:"+num20+"----num21的值為:"+num21); int num22 = 10; int num23 = 20; boolean boo3 = ++num22==11|--num23==19;//當num22==11結果已經(jīng)為true時候,還會去執(zhí)行右邊的操作 System.out.println("結果"+boo3+"---num22的值為:"+num22+"----num23的值為:"+num23); int num24 = 10; int num25 = 20; boolean boo4 = ++num24==11||--num25==19;//當num24==11結果已經(jīng)為ture時候,就不再去執(zhí)行右邊的操作 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 /* *規(guī)律:向右每移動一位相當于在上一次一動基礎上除以2,右移n次為:num26/2^n,空出來的部分整數(shù)補0,負數(shù)補1 *代碼分析: *16:0000 0000 0000 0000 0000 0000 0001 0000 向右移動2位:0000 0000 0000 0000 0000 0000 0000 0010 結果為4 *思考:負數(shù)右移結果? *-16>>2=? 1000 0000 0000 0000 0000 0000 0001 0000 向右一動2位:0010 0000 0000 0000 0000 0000 0000 0010 結果為:536,870,914 *應該按照存儲的數(shù)據(jù)來運算,即補碼運算: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 //規(guī)律:向左移動一位,相當于在原有的基礎上乘以2,高位拋棄,低位補0,左移n次為:num27*2^n System.out.println(-3 << 2);//結果為:-12 ?11111111111111111111111111110100? //無符號右移,高位補零,低位舍去 int num28 = -16; System.out.println(-4 >>> 2);//變?yōu)檎龜?shù) System.out.println(8 >>> 2);//與右移一致 //&:與運算,兩個二進制數(shù)按位運算,都為1,則該位結果為1,否則為0(一一得一) System.out.println(5 & 6);//0000 0101 & 0000 0110 = 0000 0100 結果為:4 //|:或運算,兩個二進制數(shù)按位運算,有1,則為1,都為0,才是0 (有一得一) System.out.println(5 | 6);//0000 0101 | 0000 0110 = 0000 0111結果為:7 //^:異或運算,兩個二進制數(shù)按位運算,不一樣,則為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,字符串可以使用==進行內(nèi)容判斷 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; } }
新聞熱點
疑難解答