BOO入門/變數
BOO入門 > 變數 (上一章:開始 下一章:流程控制/條件)
把 Booish 當成計算機
[編輯]有五個基本的數字運算子:加 +、減 -、乘 *、除 /、取餘數 %,就先用這幾個運算子來試試吧。
$ booish >>> 2 + 4 // 兩個 '/' 之後表示註解 6 >>> 2 * 4 # 在 '#' 之後也是註解 8 >>> 4 / 2 /* 這也是一個註解 */ 2 >>> (500/10)*2 100 >>> 7 / 3 // 數值相除 2 >>> 7 % 3 // 取餘數 1 >>> -7 / 3 -2
你應該注意到上面包含了三種註解的方式: //、# 和 /* */。他們對程式沒有影響,不過在你寫程式時卻是很有用的幫手。
或許你還注意到 7/3 並不是得到 2.333....,這是因為你拿兩個整數相除。
電腦處理整數相除時,會作四捨五入去掉小數。 因此有小數位的話,你必須使用浮點數。
$ booish >>> 7.0 / 3.0 // Floating point division 2.33333333333333 >>> -8.0 / 5.0 -1.6
如果你的數字有小數點,即使它是 .0,它仍然是浮點數。
數字的型別
[編輯]浮點數的種類有三種:單精度(single)、雙精度(double)與 decimal。
單精度與雙精的不同在於可表達數字的大小。在大部分的情況下,會比較偏好使用雙精。
這兩者是以二進制為基底,在十進制數字系統運作時會導致一些問題發生。通常是沒什麼關係,但是在某些特定情況,像銀行,是不允許在數十兆的金錢合約中遺失一、兩分錢的。
這是 Decimal 被建立的原因。它是十進制的數字,這意味著不會遺失掉寶貴的一分錢。在正常的情形,倍經度非常完美。但在要求高精準的情況下,應該要使用 decimal。
之前我們提到的整數,其實也有多種的型別。"unsigned" 表示不允許存放負數﹔大小也有所不同:byte、short、int 和 long。 大部分的情況下,預設是使用 int。
字元與字串
[編輯]所有在字母表的字母是字元,所有數字是字元,所有漢語字是字元,所有數學符號也是字元。在 Boo/.NET 裡面,字元都是以 Unicode 來編碼。
"apple" 就是宣告一個字串。
$ booish >>> s = "apple" 'apple' >>> print s apple >>> s += " banana" 'apple banana' >>> print s apple banana >>> c = char('C') C >>> print c C
看完例子,你可能不太想用字元,而改使用字串了。宣告字串的方式有三種:
- 使用雙引號,像是 "apple"
- 使用單引號,像是 'apple'
- 使用三個雙引號 """apple"""
前兩者的範圍都只有在單行,但三個雙引號可以跨越多行﹔此外,前兩者可以包含 '\'(反斜線逸出字元),第三者則將所有字元如實表示出來。
$ booish >>> print "apple\nbanana" apple banana >>> print 'good\ttimes' good times >>> print """Leeroy\Jenkins""" Leeroy\Jenkins
一般常見逸出字元有:
- \\ 倒斜線(譯註:原文為 literal backslash,我懷疑這邊有問題)
- \n 換行
- \r 回行首
- \t tab
如果你宣告了雙引號的字串,而你在字串裡又想使用雙引號的話,你可以使用 '\'(反斜線),同樣地,單引號字串也可以這樣使用。
$ booish >>> print "The man said \"Hello\"" The man said "Hello" >>> print 'I\'m happy' I'm happy
字串是不變的,這意味著字串裡面的字元永遠不會被改變,你必須重新建立字串以改變其中的一個字元。(譯註:這是指內部處理而言,實際上當你重複指定,如: s="10" s="20",內部實際上是建立了 "10" 這個物件,然後將 s 指向 "10",接著再建立 "20" 這個物件,再把 s 指向 "20"。就是因為這樣,作者才會說字串裡面的字元永遠不會被改變。)
字串的插值
[編輯]字串插值讓你可以插入任何合法的 boo 運算式的值到字串裡面,使用方法是在運算式前後加上 ${}。
$ booish >>> name = "Santa Claus" Santa Claus >>> print "Hello, ${name}!" Hello, Santa Claus! >>> print "2 + 2 = ${2 + 2}" 2 + 2 = 4
建議使用字串插值來取代字串相加的方式,原因是這比較簡單而且直覺。
字串插值會作用在使用雙引號的字串(含三引號的字串),但不作用在單引號的字串。
str = "Hello world!"
str_single_quote = '${str}'
str_double_quote = "${str}"
str_triple_quote = """${str}"""
print str_single_quote
print str_double_quote
print str_triple_quote
# 結果:
# ${str}
# Hello world!
# Hello world!
不想讓字串插值作用的話,在 $ 前面加上溢出字元 '\' 即,例如:\${}
布林
[編輯]布林(Boolean)數值只能是 true(真) 或 false(假),在下個章節提到的條件式裡會經常被用到。
$ booish >>> b = true true >>> print b True >>> b = false false >>> print b False
對象型別
[編輯]在 Boo/.NET 裡面,任何東西都是對象。即使像數字、字元這些值型別,也都是對象。
$ booish >>> o as object >>> o = 'string' 'string' >>> print o string >>> o = 42 42 >>> print o 42
對象的問題是,你無法期望他是一個字串或是一個整數。看看下面的例子,如果不宣告 o as object 的話,這樣的順序是會出錯的:(譯註:Boo 會自動預測你所使用的型別,由於第一次被指定為字串,所以之後 o 就都被認定為字串了,接著再指派給它一個整數,Boo 會認定為錯誤,如果你修改為 o as object = "string" ,那麼就不會出錯,但是就無法得知 o 是一個字串或是一個整數了。)
$ booish >>> o = 'string' 'string' >>> print o string >>> o = 42 --------^ ERROR: Cannot convert 'System.Int32' to 'System.String'.
靜態型別可以讓程式碼更為安全與可靠。
宣告型別
[編輯]這一章的最後,你會學到如何宣告變數的型別,也就是 o as object,<變數> as <型別> 的語法在任何型別上都適用,<型別>可以是 int、string、DateTime、bool 或是任何你自己定義的類別。
大部分的情況,Boo 都能聰明地知道你要的是什麼型別,i=25 就等同於 i as int = 25。
值型別列表
[編輯]Boo 型別 | .NET Framework 型別 | 可表示正負? | 長度(bytes) | 數值範圍 |
---|---|---|---|---|
sbyte | System.Sbyte | 是 | 1 | -128 ~ 127 |
short | System.Int16 | 是 | 2 | -32768 ~ 32767 |
int | System.Int32 | 是 | 4 | -2147483648 ~ 2147483647 |
long | System.Int64 | 是 | 8 | -9223372036854775808 ~ 9223372036854775807 |
byte | System.Byte | 否 | 1 | 0 ~ 255 |
ushort | System.Uint16 | 否 | 2 | 0 ~ 65535 |
uint | System.UInt32 | 否 | 4 | 0 ~ 4294967295 |
ulong | System.Uint64 | 否 | 8 | 0 ~ 18446744073709551615 |
single | System.Single | 是 | 4 | 接近 ±1.5 x 10-45 - ±3.4 x 1038 到七個有效位數 |
double | System.Double | 是 | 8 | 接近 ±5.0 x 10-324 - ±1.7 x 10308 到 15 或 16 個有效位數 |
decimal | System.Decimal | 是 | 12 | 接近±1.0 x 10-28 - ±7.9 x 1028 到 28 或 29 個有效位數 |
char | System.Char | N/A | 2 | Any UTF-16 character |
bool | System.Boolean | N/A | 1 | true 或 false |
練習
[編輯]- 宣告一些變數看看。