Java中的运算符
運算符
算術運算符
Java程序中,整數運算,結果只能得到整數,想得到小數,需要浮點數參與運算
整數的除法運算得到的是商
整數的取余運算得到的是余數
運算符和表達式
運算符:對常量或者變量進行操作的符號
表達式:用運算符把常量或者變量連接起來符合java語法的式子就可以稱為表達式。
? 不同運算符連接的表達式體現的是不同類型的表達式。
一個小練習:
int a = 10; int b = 20; int c = a + b;+:是運算符,并且是算術運算符。
a + b:是表達式,由于+是算術運算符,所以這個表達式叫算術表達式。
| + | 加 | 參看小學一年級 |
| - | 減 | 參看小學一年級 |
| * | 乘 | 參看小學二年級,與“×”相同 |
| / | 除 | 參看小學二年級,與“÷”相同 |
| % | 取余 | 獲取的是兩個數據做除法的余數 |
注意:
/和%的區別:兩個數據做除法,/取結果的商,%取結果的余數。
整數操作只能得到整數,要想得到小數,必須有浮點數參與運算。
int a = 10; int b = 3; System.out.println(a / b); // 輸出結果3 System.out.println(a % b); // 輸出結果1字符的“+”操作
char類型的數據參與算術運算,會自動提升為int類型,使用的是字符在計算機底層中對應的十進制整數值。
記住三個字符對應的數值:
‘a’ – 97 a-z是連續的,所以’b’對應的數值是98,'c’是99,依次遞加
‘A’ – 65 A-Z是連續的,所以’B’對應的數值是66,'C’是67,依次遞加
‘0’ – 48 0-9是連續的,所以’1’對應的數值是49,'2’是50,依次遞加
不同的基本數據類型參與運算時,整個算術表達式的類型會自動進行提升,提升為參與運算的最高等級。
? 提升規則:
byte類型,short類型和char類型將被提升到int類型,不管是否有其他類型參與運算。
整個表達式的類型自動提升到表達式中最高等級操作數相同的類型
等級順序:byte,short,char --> int --> long --> float --> double
一個小練習:
byte b1 = 10; byte b2 = 20; // byte b3 = b1 + b2; // 該行報錯,因為byte類型參與算術運算會自動提示為int,int賦值給byte可能損失精度 int i3 = b1 + b2; // 應該使用int接收 byte b3 = (byte) (b1 + b2); // 或者將結果強制轉換為byte類型 ------------------------------- int num1 = 10; double num2 = 20.0; double num3 = num1 + num2; // 使用double接收,因為num1會自動提升為double類型正是由于上述原因,所以在程序開發中我們很少使用byte或者short類型定義整數。也很少會使用char類型定義字符,而使用字符串類型,更不會使用char類型做算術運算。
字符串連接符
當“+”操作中出現字符串時,這個”+”是字符串連接符,而不是算術運算。
System.out.println("itheima"+ 666); // 輸出:itheima666在”+”操作中,如果出現了字符串,就是連接運算符,否則就是算術運算。當連續進行“+”操作時,從左到右逐個執行。
System.out.println(1 + 99 + "年"); // 輸出:199年 System.out.println(1 + 2 + "和" + 3 + 4); // 輸出:3和34 // 可以使用小括號改變運算的優先級 System.out.println(1 + 2 + "和" + (3 + 4)); // 輸出:3和7在以后的輸出語句中,我們可以使用字符串連接符使輸出結果更加清晰。
int age = 20;System.out.println("我的年齡是" + age);//輸出結果是: //我的年齡是20賦值運算符
賦值運算符的作用是將一個表達式的值賦給左邊,左邊必須是可修改的,不能是常量。
最基本的賦值運算符是“=”,表示將右邊表達式的值賦值給左邊的變量。
| = | 賦值 | a=10,將10賦值給變量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 |
都表示先將左邊與右邊做相應的運算,再賦值給左邊。
注意:
擴展的賦值運算符隱含了強制類型轉換。
一個小練習:
short s = 10; s = s + 10; // 此行代碼報出,因為運算中s提升為int類型,運算結果int賦值給short可能損失精度s += 10; // 此行代碼沒有問題,隱含了強制類型轉換,相當于 s = (short) (s + 10);自增自減運算符
| ++ | 自增 | 變量的值加1 |
| – | 自減 | 變量的值減1 |
注意事項:
? ++和-- 既可以放在變量的后邊,也可以放在變量的前邊。
? 單獨使用的時候, ++和-- 無論是放在變量的前邊還是后邊,結果是一樣的。
? 參與操作的時候,如果放在變量的后邊,先拿變量參與操作,后拿變量做++或者–。
? 參與操作的時候,如果放在變量的前邊,先拿變量做++或者–,后拿變量參與操作。
? 最常見的用法:單獨使用。
int i = 10; i++; // 單獨使用 System.out.println("i:" + i); // i:11int j = 10; ++j; // 單獨使用 System.out.println("j:" + j); // j:11int x = 10; int y = x++; // 賦值運算,++在后邊,所以是使用x原來的值賦值給y,x本身自增1 System.out.println("x:" + x + ", y:" + y); // x:11,y:10int m = 10; int n = ++m; // 賦值運算,++在前邊,所以是使用m自增后的值賦值給n,m本身自增1 System.out.println("m:" + m + ", m:" + m); // m:11,m:11一個小練習:
int x = 10; int y = x++ + x++ + x++; System.out.println(y); // y的值是多少? /* 解析,三個表達式都是++在后,所以每次使用的都是自增前的值,但程序自左至右執行,所以第一次自增時,使用的是10進行計算,但第二次自增時,x的值已經自增到11了,所以第二次使用的是11,然后再次自增。。。 所以整個式子應該是:int y = 10 + 11 + 12; 輸出結果為33。 */ 注意:通過此練習深刻理解自增和自減的規律,但實際開發中強烈建議不要寫這樣的代碼!小心挨打!關系運算符
關系運算符有6種關系,分別為小于、小于等于、大于、等于、大于等于、不等于。
| == | a==b,判斷a和b的值是否相等,成立為true,不成立為false |
| != | a!=b,判斷a和b的值是否不相等,成立為true,不成立為false |
| > | a>b,判斷a是否大于b,成立為true,不成立為false |
| >= | a>=b,判斷a是否大于等于b,成立為true,不成立為false |
| < | a<b,判斷a是否小于b,成立為true,不成立為false |
| <= | a<=b,判斷a是否小于等于b,成立為true,不成立為false |
注意事項:
? 關系運算符的結果都是boolean類型,要么是true,要么是false。
? 千萬不要把“”誤寫成“=”,"“是判斷是否相等的關系,”="是賦值。
一個小練習:
int a = 10; int b = 20; System.out.println(a == b); // false System.out.println(a != b); // true System.out.println(a > b); // false System.out.println(a >= b); // false System.out.println(a < b); // true System.out.println(a <= b); // true// 關系運算的結果肯定是boolean類型,所以也可以將運算結果賦值給boolean類型的變量 boolean flag = a > b; System.out.println(flag); // 輸出false邏輯運算符
邏輯運算符把各個運算的關系表達式連接起來組成一個復雜的邏輯表達式,以判斷程序中的表達式是否成立。
邏輯運算的結果肯定是boolean類型,要么是true要么是false。
| & | 邏輯與 | a&b,a和b都是true,結果為true,否則為false |
| | | 邏輯或 | a|b,a和b都是false,結果為false,否則為true |
| ^ | 邏輯異或 | a^b,a和b結果不同為true,相同為false |
| ! | 邏輯非 | !a,結果和a的結果正好相反 |
一個小練習:
//定義變量 int i = 10; int j = 20; int k = 30;//& “與”,并且的關系,只要表達式中有一個值為false,結果即為false System.out.println((i > j) & (i > k)); //false & false,輸出false System.out.println((i < j) & (i > k)); //true & false,輸出false System.out.println((i > j) & (i < k)); //false & true,輸出false System.out.println((i < j) & (i < k)); //true & true,輸出true System.out.println("--------");//| “或”,或者的關系,只要表達式中有一個值為true,結果即為true System.out.println((i > j) | (i > k)); //false | false,輸出false System.out.println((i < j) | (i > k)); //true | false,輸出true System.out.println((i > j) | (i < k)); //false | true,輸出true System.out.println((i < j) | (i < k)); //true | true,輸出true System.out.println("--------");//^ “異或”,相同為false,不同為true System.out.println((i > j) ^ (i > k)); //false ^ false,輸出false System.out.println((i < j) ^ (i > k)); //true ^ false,輸出true System.out.println((i > j) ^ (i < k)); //false ^ true,輸出true System.out.println((i < j) ^ (i < k)); //true ^ true,輸出false System.out.println("--------");//! “非”,取反 System.out.println((i > j)); //false System.out.println(!(i > j)); //!false,,輸出true短路邏輯運算符
| && | 短路與 | 作用和&相同,但是有短路效果 |
| || | 短路或 | 作用和|相同,但是有短路效果 |
在邏輯與運算中,只要有一個表達式的值為false,那么結果就可以判定為false了,沒有必要將所有表達式的值都計算出來,短路與操作就有這樣的效果,可以提高效率。同理在邏輯或運算中,一旦發現值為true,右邊的表達式將不再參與運算。
- 邏輯與&,無論左邊真假,右邊都要執行。
- 短路與&&,如果左邊為真,右邊執行;如果左邊為假,右邊不執行。
- 邏輯或|,無論左邊真假,右邊都要執行。
- 短路或||,如果左邊為假,右邊執行;如果左邊為真,右邊不執行。
一個小練習:
int x = 3; int y = 4; System.out.println((x++ > 4) & (y++ > 5)); // 兩個表達都會運算 System.out.println(x); // 4 System.out.println(y); // 5System.out.println((x++ > 4) && (y++ > 5)); // 左邊已經可以確定結果為false,右邊不參與運算 System.out.println(x); // 4 System.out.println(y); // 4三元運算符
三元運算符語法格式:
關系表達式 ? 表達式1 : 表達式2;解釋:問號前面的位置是判斷的條件,判斷結果為boolean型,為true時調用表達式1,為false時調用表達式2。其邏輯為:如果條件表達式成立或者滿足則執行表達式1,否則執行第二個。
一個小練習:
int a = 10; int b = 20; int c = a > b ? a : b; // 判斷 a>b 是否為真,如果為真取a的值,如果為假,取b的值模擬題:
1、需求:動物園里有兩只老虎,已知兩只老虎的體重分別為180kg、200kg,請用程序實現判斷兩只老虎的體重是否相同。
public class OperatorTest01 {public static void main(String[] args) {//1:定義兩個變量用于保存老虎的體重,單位為kg,這里僅僅體現數值即可。int weight1 = 180;int weight2 = 200; //2:用三元運算符實現老虎體重的判斷,體重相同,返回true,否則,返回false。boolean b = weight1 == weight2 ? true : false; //3:輸出結果System.out.println("b:" + b);} }2、需求:一座寺廟里住著三個和尚,已知他們的身高分別為150cm、210cm、165cm,請用程序實現獲取這三個和尚的最高身高。
public class OperatorTest02 {public static void main(String[] args) {//1:定義三個變量用于保存和尚的身高,單位為cm,這里僅僅體現數值即可。int height1 = 150;int height2 = 210;int height3 = 165; //2:用三元運算符獲取前兩個和尚的較高身高值,并用臨時身高變量保存起來。int tempHeight = height1 > height2 ? height1 : height2; //3:用三元運算符獲取臨時身高值和第三個和尚身高較高值,并用最大身高變量保存。int maxHeight = tempHeight > height3 ? tempHeight : height3; //4:輸出結果System.out.println("maxHeight:" + maxHeight);} }數據輸入
我們可以通過 Scanner 類來獲取用戶的輸入。
使用步驟
1、導包。Scanner 類在java.util包下,所以需要將該類導入。導包的語句需要定義在類的上面。
import java.util.Scanner;2、創建Scanner對象。
Scanner sc = new Scanner(System.in);// 創建Scanner對象,sc表示變量名,其他均不可變3、接收數據
int i = sc.nextInt(); // 表示將鍵盤錄入的值作為int數返回。一個小練習:
import java.util.Scanner; public class ScannerDemo {public static void main(String[] args) {//創建對象Scanner sc = new Scanner(System.in);//接收數據int x = sc.nextInt();//輸出數據System.out.println("x:" + x);} }模擬題:
改寫三個和尚案例,數據使用鍵盤錄入。
import java.util.Scanner; public class ScannerTest {public static void main(String[] args) {//身高未知,采用鍵盤錄入實現。首先導包,然后創建對象。Scanner sc = new Scanner(System.in);//鍵盤錄入三個身高分別賦值給三個變量。System.out.println("請輸入第一個和尚的身高:");int height1 = sc.nextInt();System.out.println("請輸入第二個和尚的身高:");int height2 = sc.nextInt();System.out.println("請輸入第三個和尚的身高:");int height3 = sc.nextInt();//用三元運算符獲取前兩個和尚的較高身高值,并用臨時身高變量保存起來。int tempHeight = height1 > height2 ? height1 : height2;//用三元運算符獲取臨時身高值和第三個和尚身高較高值,并用最大身高變量保存。int maxHeight = tempHeight > height3 ? tempHeight : height3;//輸出結果。System.out.println("這三個和尚中身高最高的是:" + maxHeight +"cm");} }流程控制語句
在一個程序執行的過程中,各條語句的執行順序對程序的結果是有直接影響的。所以,我們必須清楚每條語句的執行流程。而且,很多時候要通過控制語句的執行順序來實現我們想要的功能。
流程控制語句分類
順序結構
順序結構是程序中最簡單最基本的流程控制,沒有特定的語法結構,按照代碼的先后順序,依次執行,程序中大多數的代碼都是這樣執行的。
順序結構執行流程:
分支結構之if語句
if結構
格式: if (關系表達式) {語句體; }執行流程:
一個小練習:
public class IfDemo {public static void main(String[] args) {System.out.println("開始"); //定義兩個變量int a = 10;int b = 20; //需求:判斷a和b的值是否相等,如果相等,就在控制臺輸出:a等于bif(a == b) {System.out.println("a等于b");} //需求:判斷a和c的值是否相等,如果相等,就在控制臺輸出:a等于cint c = 10;if(a == c) {System.out.println("a等于c");} System.out.println("結束");} }示例:
public class IfDemo {public static void main(String[] args) {System.out.println("開始"); //定義兩個變量int a = 10;int b = 20; //需求:判斷a和b的值是否相等,如果相等,就在控制臺輸出:a等于bif(a == b) {System.out.println("a等于b");} //需求:判斷a和c的值是否相等,如果相等,就在控制臺輸出:a等于cint c = 10;if(a == c) {System.out.println("a等于c");} System.out.println("結束");} }if…else結構
格式: if (關系表達式) {語句體1; } else {語句體2; }執行流程:
①首先計算關系表達式的值
②如果關系表達式的值為true就執行語句體1
③如果關系表達式的值為false就執行語句體2
④繼續執行后面的語句內容
一個小練習:
public class IfDemo02 {public static void main(String[] args) {System.out.println("開始"); //定義兩個變量int a = 10;int b = 20;b = 5; //需求:判斷a是否大于b,如果是,在控制臺輸出:a的值大于b,否則,在控制臺輸出:a的值不大于bif(a > b) {System.out.println("a的值大于b");} else {System.out.println("a的值不大于b");} System.out.println("結束");} }模擬題:
奇偶數
需求:任意給出一個整數,請用程序實現判斷該整數是奇數還是偶數,并在控制臺輸出該整數是奇數還是偶數。
分析:
? ①為了體現任意給出一個整數,采用鍵盤錄入一個數據
? ②判斷整數是偶數還是奇數要分兩種情況進行判斷,使用if…else結構
? ③判斷是否偶數需要使用取余運算符實現該功能 number % 2 == 0
? ④根據判定情況,在控制臺輸出對應的內容
import java.util.Scanner; public class IfTest01 {public static void main(String[] args) {//為了體現任意給出一個整數,采用鍵盤錄入一個數據。(導包,創建對象,接收數據)Scanner sc = new Scanner(System.in); System.out.println("請輸入一個整數:");int number = sc.nextInt(); //判斷整數是偶數還是奇數要分兩種情況進行判斷,使用if..else結構 //判斷是否偶數需要使用取余運算符實現該功能 number % 2 == 0//根據判定情況,在控制臺輸出對應的內容if(number%2 == 0) {System.out.println(number + "是偶數");} else {System.out.println(number + "是奇數");} } }if…else…if結構:
格式: if (關系表達式1) {語句體1; } else if (關系表達式2) {語句體2; } … else {語句體n+1; }執行流程:
①首先計算關系表達式1的值
②如果值為true就執行語句體1;如果值為false就計算關系表達式2的值
③如果值為true就執行語句體2;如果值為false就計算關系表達式3的值
④…
⑤如果沒有任何關系表達式為true,就執行語句體n+1。
一個小練習:
import java.util.Scanner; public class IfDemo03 {public static void main(String[] args) {System.out.println("開始");// 需求:鍵盤錄入一個星期數(1,2,...7),輸出對應的星期一,星期二,...星期日Scanner sc = new Scanner(System.in);System.out.println("請輸入一個星期數(1-7):");int week = sc.nextInt();if(week == 1) {System.out.println("星期一");} else if(week == 2) {System.out.println("星期二");} else if(week == 3) {System.out.println("星期三");} else if(week == 4) {System.out.println("星期四");} else if(week == 5) {System.out.println("星期五");} else if(week == 6) {System.out.println("星期六");} else {System.out.println("星期日");} System.out.println("結束");} }模擬題:
需求:小明快要期末考試了,小明爸爸對他說,會根據他不同的考試成績,送他不同的禮物,假如你可以控制小明的得分,請用程序實現小明到底該獲得什么樣的禮物,并在控制臺輸出。
分析:
? ①小明的考試成績未知,可以使用鍵盤錄入的方式獲取值
? ②由于獎勵種類較多,屬于多種判斷,采用if…else…if格式實現
? ③為每種判斷設置對應的條件
? ④為每種判斷設置對應的獎勵
import java.util.Scanner; public class IfTest02 {public static void main(String[] args) {//小明的考試成績未知,可以使用鍵盤錄入的方式獲取值Scanner sc = new Scanner(System.in); System.out.println("請輸入一個分數:");int score = sc.nextInt();//由于獎勵種類較多,屬于多種判斷,采用if...else...if格式實現//為每種判斷設置對應的條件//為每種判斷設置對應的獎勵 //數據測試:正確數據,邊界數據,錯誤數據if(score>100 || score<0) {System.out.println("你輸入的分數有誤");} else if(score>=95 && score<=100) {System.out.println("山地自行車一輛");} else if(score>=90 && score<=94) {System.out.println("游樂場玩一次");} else if(score>=80 && score<=89) {System.out.println("變形金剛玩具一個");} else {System.out.println("胖揍一頓");}} }總結
- 上一篇: 程序员应学会养生
- 下一篇: Java 通过URL获取页面快照十种方式