上次介紹完了運算子,這次也繼續其他的基本語法吧
文檔 : https://www.kotlincn.net/docs/reference/basic-syntax.html
IF條件式
當執行程式時遇到了要判別是否執行某段程式碼時就需要使用條件式,if就是非常常見的用法,可以搭配else和else if 使用。
下面舉一個例子,"小明"和"小美"在玩比數字大小,兩人都先個抽一個數字,數字大的獲勝,相同則平手,寫成程式碼如下:
fun main() { //1到10隨機取數 val a = (1..10).random() //小明 val b = (1..10).random() //小美 if(a > b){ println("小明獲勝") }else if(a < b){ println("小美獲勝") }else{ println("平手") } }
if在判斷true or false上非常方便,但是當遇到有大量條件時用一堆else if 來寫似乎又有些冗長了,這時候就有一個更方便的語法可以使用了,那就是when
*事實上當你使用了else if 和else的時候,系統會提醒你說這邊可以使用when
*1..10代表1到10(1,2,3,4,5,6,7,8,9,10)
When
現在假設有5支籤,分別代表等等午餐要吃甚麼,便當、麵、水餃、速食、不吃,這時候就可以用when來執行了
fun main() { val a = (1..5).random() //5支籤,隨機抽出1支 when(a){ 1 -> println("便當") 2 -> println("麵") 3 -> println("水餃") 4 -> println("速食") else -> println("不吃") //其他情況,也就是a=5的情況 } }
這樣程式碼看起來就簡潔多了,可讀性也增加了不少
For迴圈
當我在條件內要多次執行同一段code時就可以使用for,而kotlin的for語法相較其他語言又更簡潔了,下面直接上例子
fun main() { for (i in 1..10){ //i從1到10,每執行一次i+1,超過10則跳出迴圈 println(i) //印出i } }
結果
1
2
3
4
5
6
7
8
9
10
如果i的值只能遞增那豈不是很單調,為了因應各種狀況也有不同的語法產生
.. : 遞增,例 : for(1..5)代表1,2,3,4,5,每次i+1
downTo : 遞減,例 : for(5 downTo 1)代表5,4,3,2,1,每次i-1
until : 遞增直到,例 : for(1 until 5)代表1,2,3,4,每次i+1
step : 改變遞增量,例 : for(1..5 step 2)代表1,3,5,每次i+2
下面示範一個downTo 結合 step的用法
fun main() { for (i in 10 downTo 1 step 2){ //i從10到1,每執行一次i-2,小於1則跳出迴圈 println(i) //印出i } }
結果
10
8
6
4
2
另外,當我在執行迴圈時遇到某些狀況時要執行特殊動作時該怎麼辦呢?
這邊有兩個語法可以使用break和continue
break : 跳出迴圈
continue : 跳過後面程式碼,執行下一個迴圈
下面針對上面的介紹來一個整合的例子吧
一個班級有10個人,現在要案學號順序來回答問題,由於上次單數號已經回答過了,因此這次只由雙數號執行,其中2、4號已經回答過問題了會跳過,當選到人時則會跳出迴圈
fun main() { //後續會再介紹集合(list等)的用法,現在先知道就好 val listAnswered = mutableListOf<Int>() //建立1個已經回答過的列表 listAnswered.add(2) //2和4已經回答過加入列表 listAnswered.add(4) for (i in 2..10 step 2){ //i從2到10,每執行一次i+2,大於於10則跳出迴圈 if (i in listAnswered){ // 當i在回答過的列表時,跳過迴圈 continue //這之下的不會執行 } println("學號 : $i 號回答問題" ) //學號 : 6 號回答問題 listAnswered.add(i) //回答後加入列表 break //跳出迴圈 } println(listAnswered) //[2, 4, 6],6已加入列表 }
最後只會印出 : 學號 : 6 號回答問題
*i in list_answered 這段檢查i是否在list內
While、do-while
while其實跟for是差不多的,但只是單純的判斷條件是否符合,不符合便跳出迴圈,個人絕的while使用起來比for更加靈活
使用上面的例子但改用while來執行
fun main() { //後續會再介紹集合(list等)的用法,現在先知道就好 val listAnswered = mutableListOf<Int>() //建立1個已經回答過的列表 listAnswered.add(2) //2和4已經回答過加入列表 listAnswered.add(4) var drawn = false //加入一個Boolean判斷是否抽到 var i = 2 //先定義i while (!drawn){ //當drawn==false時執行迴圈 if (i in listAnswered){ // 當i在回答過的列表時,跳過迴圈 i += 2 //雙數號每次 i + 2 continue //這之下的不會執行 } println("學號 : $i 號回答問題" ) //學號 : 6 號回答問題 listAnswered.add(i) //回答後加入列表 drawn = true //將drawn改為true,不符合條件將跳出迴圈(當然也可以用break) } }
結果一樣是 : 學號 : 6 號回答問題
這邊要特別注意迴圈內部參數的位置,不然可能永遠跳不出迴圈,假如i += 2這段放在continue後面就跳不出迴圈了,因為i的值不會改變
而do-while本上與while是一樣的,只是while是先判斷在執行,而do-while則是先執行在判斷,下面提供一個例子比較兩者的差異
fun main() { var i = 1 while (i < 1){ //當i<1時執行迴圈 println(i) //不會印出東西,因為第一次判斷時就跳出迴圈了 i++ } i = 1 do { println(i) //結果 1 ,至少會執行一次才跳出迴圈 i++ }while (i < 1)//當i<1時執行迴圈 }