基本語法

      在〈基本語法〉中尚無留言

程式架構

Kotlin程式碼通常是以package開頭。此package與目錄無關,只是區隔應用程式的名稱而以。接下來為
fun main(){},此為程式的進入點,參數必需為 args: Array<String>

package com.asuscomm.mahaljsp
fun main(args: Array<String>){
    println("Hello, world");
}

列印

列印訊息有二個方法,print 及 println ,差別在print不會印出換行,加上 ln 就會列印換行符號。

字串相加

二字串使用 “+” 相加可以結合成一個字串,如下

print("單價 : " + price + ", 數量 : " + qty + ", 總價 : " + (price*qty));

上述使用字串相加的方式,會比字串格式化還要雜亂。

指令結尾

C/C++/C#/Java在每行指令的後面,都必需使用 “;” 當結尾。Python及Kotlin則不用,直接使用 enter 當結尾

註解

在程式碼中如果需要註解說明的話,可以使用二種方式

// : 單行註解

/*
這是多行註解
*/

變數

當需要儲存一個資料時,必需向系統要求一個空間,然後給予這個空間一個名字,並指定此空間的資料型態。因此空間內的值可以隨時變化,因此就稱此空間為變數。

Kotlin並沒有基本資料類型,全部都是物件類型的數字,常用的型態有 Byte,Short,Int,Long,Float,Double等

類型 長度 範圍值 無號符
整數 Byte 8 -128~128 Ubyte
Short 16 -32768~32767 Ushort
Int 32 -21億 ~ 21 億 Uint
Long 64 -263~263 -1 Ulong
小數 Float 32 精準到小數第7位
Double 64 精準到小數第15位
其他 Char 2
Boolean true/false
String

常數

常數數字的表示方式如下

Int : 123 (預設為Int)
Long : 123L
16進位 : 0xff
2進位 : 0b01000011
Float : 123.4f
Double : 123.4f, 123.4e10(預設為Double)

常數可以使用底線隔開, 方便閱讀, 如
1_000_000
10_00000_00

 變數宣告

使用變數前, 需先進行宣告, 宣告方式為
var 變數名: 型態 = 值 , 如

var i: Int = 100 //宣告並指定值
var i: Int //不指定值

以上, 可以簡化為
var i=10
此時會自動依後面的值自動判定型別. 所以簡化寫法時一定要給值

空值宣告-null

Kotlin就算是數字或小數,都是物件型態。身為物件,就有可能為null。在Kotlin中,預設變數是不可以有空值的,這是為了避開NullPointerException(NPE)的錯誤。但也是可以手動將變數設為null,此時需加上 “?” 符號宣告。

請注意,一但宣告變數可能為null時,就一定要指定型態

var a:Int
a=null //此行會出現錯誤
var b:Int? //一定要指定Int型態
b=null //此行正常

可空變數影響的層面非常廣泛,所以本站獨立另外一個章節說明,請參考 空值Null Safety

常數宣告

val 常數名稱: 型態= 值,

val PI:Double=3.14159
val COUNT=1

常數可以宣告後不給值,而是在第一次使用前再給值

val PI:Float
.............
PI=3.1415926f

運算元與運算子

以下面的式子說明,
c = a / b
其中的 c, a, b 稱為運算元, “=” , “/” 稱為運算子(operator)

這些特殊符號, 共分為如下幾種

指定運算子

指定運算子即 “=”

var a=10
var b=20
var c=a+b

“=”的意思為,  把”=”右邊的值(a+b), 放到左邊(c)

算式運算子

有 + – * /  %  ++ — ,  + – * 就不用說明了

/ : 除號, 請注意, 當二個整數相除時, 其結果亦為整數, 請看下代碼

var a=10
var b=6
var c=a/b
println(c)

結果 : 
1

% 為求餘數的運算子,  如下的代碼, 結果為 4

var a=10
var b=6
var c=a%b
println(c)

++, — 為加1與減1, 先看如下代碼

var a=10
println("a++ = " + a++)
println("a = " + a)

結果 : 
a++ = 10
a = 11

結果是不是有點奇怪了!! a++ 不是加1嗎, 為什麼列出來確是 10?  這是因為 a++ 是先處理再加1, 先處理什麼呢? 先把 a 的值交給 print 列印, 然後才加1. 所以第二次列印 a 時, 就變成了 11.

那如果是 println(++a), 結果就是 11 (先加1再處理)

比較運算子

有 >, <=, <, <=, ==, !=, ===

== 是比較二邊的值是否相等
!= 是比較二邊的值是否不相等
=== 是比較二邊是否為同一個位件

邏輯運算子

&& : and
||  : or

型別轉換

var a:Int=10
var b:Int=6
print(a/6)
println(a/b)

上面印出的結果, 都是整數1. 若想印出小數呢
第1個print比較好解決, 改成 print(a/6.0f) 即可
第2個print需改成 print(a/b.toFloat())

這二個都是強制轉型的概念

鍵盤輸入

鍵盤輸入有二種, 第一種為readLine()函數, 第二種為Scanner()物件

readLine

宣告為字串時,需寫成如下

var a:String?
a=null

readLine()雖然不可能傳回null,但其型態為String,所以必需寫成如下

var price:String?= readLine()//因為readLine()型態為字串,但有可能是null,所以要加"?"
//也可精簡成如下
var price:readLine()

readLine()函數所讀取的值為一行字串或null, 所以如果要進行四則運算的話, 就要再進行轉換, 如下所示

fun main(args:Array<String>){
    print("請輸入名字 : ")
    var name= readLine()
    print("請輸入年齡 : ")
    var age=Integer.parseInt(readLine())
    age=Integer.valueOf(readLine())
}

上述Integer.parseInt(string), 方法裏的參數只能為String. 
但Integer.valueOf(arg), 參數可為String或數字

readLine精簡轉換

readLine()讀進來的格式為String型態。當readLine()時,直接按Enter會得到 “” 空字串,所以readLine()不可能得到null。但 readLine()的型態為String?,是可空值型態。所以需在readLine()後面加上 “?” 這個符號. 才可以使用 .toInt() 進行轉換。不過因為readLine()不可能得到null值,所以網路上加上Elvis “?:0” 是多餘的。詳細說明請參照 空值Null Safety 說明。

底下為其精簡語法

var price= readLine()?.toInt()

Scanner

先使用Scanner(System.`in`)產生keyboard物件. 請注意, Scanner會出現紅線, 請使用 Alt+Enter import java.util.*

然後再使用kb.nextInt()輸入整數, 此時就不需再進行轉換了.

fun main(args:Array<String>){
    var kb= Scanner(System.`in`)
    print("請輸入價格 :")
    var price=kb.nextInt()
    print(price)
}

格式化列印

請注意, print/println並不支援格式化列印, 格式化列印只能交由字串處理, 再由 print/println列印字串出來.

fun main(args: Array<String>){
    var price: Int=10;
    var qty: Int=20;
    println("單價 %d, 數量 : %d, 總價 : %d".format(price, qty, price*qty));
}

字串模版

所謂的字串模版,就是在字串中可以提取出變數的值。此時變數位於字串中,但變數前面要加  “$”。這招,又是從php學來的。代碼如下

var a=10
var str="a is $a"
println(str)

如果有計算式呢? 則需使用${計算式},如下所示

print("請輸入單價 : ")
var price= readLine()?.toDouble()?:0.0
print("請輸入數量 : ")
var qty= readLine()?.toDouble()?:0.0
println("單價 : $price, 數量 : $qty, 總價 : ${price*qty}")

++ — 補充說明

var a=10
a=a+1

上述的 a=a+1, 是將 a 加 1的方法, 那為什麼還要有 a++呢? 這就需從組合語言來看了

a=a+1 a++
mov ax, a
mov bx, 1
inc cx, ax, bx
mov a, cx
mov ax, a
xinc ax
mov a, cx
需執行 4 個指令 只執行3個指令

由上可知, a=a+1需執行4個指令, 但 a++只執行3個指令, 其效能可以提高 25%

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *