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 |
练习
[编辑]- 宣告一些变数看看。