條件判斷
java語言和C 語言類似,主要包括三種基本的控制流結構:
1. 程序順序執行
2. 程序的判斷結構
3. 程序的循環結構
如果把前面所學習的關鍵字理解成java語言的詞匯量的話,那么結構化程序設計就是java語言所謂的”語法”了,這種跟計算機溝通的語言很簡單。
前面章節中我們提過,java是以分號(;)作為一個語句的結束的,與換行符沒有關系,任何一句表達式后面都必須帶有一個分號(;),這樣才算正常結束,否則會報語法錯誤,例如:
int a=100; System.out.println(a);
以上都成為單條語句,而把多個語句放到一個形如 “{...代碼...}”這樣代碼塊中,成為語句塊,就是以左大括號“{”開始,以右大括號結束“}”的代碼我們成為語句塊,左右大括號必須成對出現,語句塊可以互相嵌套。語句塊可以作為一個整體,類似把多個語句塊組合成為一個語句塊。我們在代碼中可以任意使用包含多個語句成為一段語句塊,有時也稱為程序塊。但是在一些情況下,大括號是不可缺少的,比如定義一個類的時候,或者定義一個普通方法時,后面就必須要使用大括號,包住一段語句塊。例如以下的:
public class Abc {//這個是必須的 public static void main(String[] args) {//這個是必須的 float a = 346.756565f; //這個大括號可以刪除 { int b = (int) a + 10; // 將 a 轉換為整型 System.out.println(b); } } }
下面我們講到的條件判斷和循環判斷的語法是會大量使用到程序塊。
判斷邏輯是我們生活中最常見的邏輯判斷,計算機來執行跟人類思維也是極為類似的:如果[條件成立]就怎樣做,否則就那樣做。可以這么說,計算機最擅長的就是判斷true/false了。
一、if-else 語句
if語句是最常見的判斷語句,通過對條件(conditional)的判斷覺得程序的走向。其基本格式如下:
if(條件表達式)
語句1
else
語句2
在執行該判斷語句前,都是先執行了條件表達式的語句,條件表達式的返回結果必須是布爾值(boolean),根據條件表達式的返回,如果是true,那么就執行語句1的內容,如果是false就執行else后面的語句2。如下面這個例子:
int i=1; if(i>10) System.out.println(i+"大於10"); else System.out.println(i+"不大於10");
先定義了整型i並賦值1,然后在執行if里面的條件判斷式i是否大於10,返回的結果是false,所以執行的是else后面的語句。
在上面的格式中, else是可選部分,所以最簡單的條件判斷式如下:
if(條件表達式)
語句1
如下面這個例子:
int i=1; if(i>10) System.out.println(i+"大於10");
由於條件判斷是false,所以這個程序不會輸出任何內容。也正是因為else是可選部分,在嵌套使用的時候就會出現理解上的問題,有時候我們面對下面這個例子的時候就會感覺不清晰了
int i = 1; if (i > 10) if (i < 5) System.out.println(i + "小於5"); else System.out.println(i + "不大於10");
else是對應那一個if呢?java是與最近一個if配對的。程序員在寫代碼時,適當的縮進代碼也可以提高代碼的可讀性,當然我們有更好的解決辦法。
if和else后面可以跟着語句,當然也可以跟着語句塊,其格式如下:
if(條件表達式){
語句塊1
}else{
語句塊2
}
建議大家在寫if語句時,就算后面只有一個語句,也可以使用大括號包住,形成語句塊,這樣可以提高程序的可讀性,如上面的例子,可以修改成為這樣:
if (i > 10) { if (i < 5) { System.out.println(i + "小於5"); } else { System.out.println(i + "不大於10"); } }
二、else-if 語句
有時候條件判斷不止兩個,可能就需要使用else-if語句了,其語法格式如下:
if(條件表達式)
語句1
else if(條件表達式)
語句2
else if(條件表達式)
語句3
else if(條件表達式)
語句4
...
else
語句
這樣的語句在我們以后的編程中會經常用到,判斷的過程是從上往下的判斷條件表達式,如果第一個返回的是false就會判斷第二個,依次類推,但是如果其中一個返回了true,那么就會執行后面的語句,然后整個else-if語句就會退出,后面如果還有else-if語句也不會在去判斷執行的了。我們常常也會在最后面添加一個else語句,當然這也是可選的,這樣的效果就是如果上面的所有的if判斷都是false,那么就會執行else后面的語句。像上面的if-else一樣,后面也是可以跟着語句塊的,為了增強程序的可讀性,我們后面也常常會使用語句塊。格式如下:
if(條件1){
條件1==true時執行的邏輯
}else if(條件2){
條件2==true時執行的邏輯
}else if(條件n){
條件n==true時執行的邏輯
}else{
以上條件均不滿足而執行的默認的邏輯
}
下面我們具幾個實現,比如我們要判斷用戶年齡小於16歲時不允許登陸游戲網站,那么我們可以使用以下代碼:
int uage = 17; if (uage < 18) { System.out.println("Sorry,請關注學業!"); } else { System.out.println("歡迎登陸!"); }
int result=85;//成績 if(result>90){ System.out.println("優秀"); }else if(result>80){ System.out.println("良好"); }else if(result>60){ System.out.println("合格"); }else{ System.out.println("不合格"); }
if判斷也可以嵌套使用,也就是在語句塊里也可以包含一個if判斷表達式,如下面這個例子。其中Scanner是獲得用戶輸入對象,請看下面這個例子:
import java.util.Scanner; public class Tt { public static void main(String[] args) { int num0;//第一個數 int num1;//第二個數 int type;//計算類型 System.out.print("*"請輸入num0: "*"); Scanner scr = new Scanner(System.in); num0 = scr.nextInt();//程序會在此等待用戶的輸入 System.out.print("*"請輸入num1: "*"); scr = new Scanner(System.in); num1 = scr.nextInt(); System.out.print("*"請輸入計算類型(0表示加 ; 1表示減 ; 2表示乘 ; 3表示除): "*"); scr = new Scanner(System.in); type = scr.nextInt(); if (type == 0) { System.out.println(num0 + "*"+"*" + num1 + "*" ="*" + (num0 + num1)); } else if (type == 1) { System.out.println(num0 + "*"-"*" + num1 + "*" ="*" + (num0 - num1)); } else if (type == 2) { System.out.println(num0 + "*"*"*" + num1 + "*" ="*" + (num0 * num1)); } else if (type == 3) { // 除法,使用嵌套的if語句判定除數不能為0 if (num1 == 0) { System.out.println("*"除數不能為0"*"); } else { System.out.println(num0+"*"/"*"num1+ "*" ="*" + (num0 / num1)); } } else { // 非法輸入 System.out.println("*"您的輸入有誤!計算類型只能是[0,1,2,3]"*"); } } }
在這個程序中用了Scnner獲得用戶的輸入,程序運行到scr.nextInt()的時候會停下來,等待用戶的輸入,用戶輸入后按回車程序才會繼續往下運行,在程序中我們對除法的判斷又嵌套了一個除數不能為0的判斷。
三、switch選擇語句
switch語句是另一種判斷語句的寫法,這種語句在選擇時是對case子句的值進行相等測試,其功能性其實和if判斷語句一樣,僅僅只是書寫的方式不同,兩者之間可以互通,語法上面沒有if語句簡介。其具體的語法格式如下:
switch(被判斷的變量)
{
case 條件1:
執行條件1的邏輯
break;
case 條件2:
執行條件1的邏輯
break;
case n:
執行條件n的邏輯
break;
default:
以上條件均不滿足而執行的默認的邏輯
}
switch后面的只是被判斷的變量,當與case后面的條件相等是,那么case后面的語句就會執行,最后面的default是可選項,可根據你的業務邏輯需要決定是否添加,功能類似else語句,就是上面所有的case條件都不滿足時就會執行default后面的語句。
值得注意的是,在JDK 7以前參加被判斷的變量的類型只可以是int, byte, char, short等數據類型,但是在JDK 7以后,被判斷的變量的類型被增強支持對字符串String的判斷。如果你還是使用JDK 6就要特別注意這一點了。
一般來說,switch與case成功匹配,還會繼續順序執行以后所有的程序代碼,因此一般都要在判斷成功后面添加break語句跳出判斷語句塊。有關break關鍵字的詳細說明我們會在后面的章節中說明。
看看這個例子:已知變量int month=1,使用switch判斷語句,如果month等於1就輸出"一月",等於2就輸出"二月",如此類推。實現代碼如下:
int month=4; switch(month){ case 1: System.out.println("一月"); break; case 2: System.out.println("二月"); break; case 3: System.out.println("三月"); break; case 4: System.out.println("四月"); break; //...中間的5~12用戶自己補充。 default: System.out.println("month只能是1~12"); }