在完成对变量的初始化之后,就可以使用变量了。对变量的使用包括读取和存入两种操作。
当我们需要使用变量中存储的数据时,可以 通过变量名 来读取变量值。示例程序如代码清单2-2所示。
01 main() {
02 let teacherName = "刘玥"
03 println(teacherName) // 读取变量teacherName的值
04
05 var ageOfStudent = 19
06 println(ageOfStudent) // 读取变量ageOfStudent的值
07
08 var totalScore: Float64
09 totalScore = 90.0 // 对totalScore进行初始化
10 println(totalScore) // 读取变量totalScore的值
11
12 var isScorePassed: Bool
13 isScorePassed = true // 对isScorePassed进行初始化
14 println(isScorePassed) // 读取变量isScorePassed的值
15 }
编译并执行程序,输出结果为:
刘玥
19
90.000000
true
在示例程序的第3、6、10和14行,分别通过变量名teacherName、ageOfStudent、totalScore和isScorePassed读取了变量值。
println函数在输出浮点类型数据时,默认会输出小数点后6位。例如,在以上示例中,totalScore的输出为:
90.000000
为了让输出变得更美观一些,可以使用format函数对浮点类型数据的输出指定输出精度,可以在cj文件的第1行添加以下代码:
from std import format.*
该行代码的作用是 导入 标准库format包中的所有public顶层声明,以便于调用format函数。
接着修改main中访问totalScore的代码。修改过后的代码如下所示(其中略去了不相关且没有修改的代码):
from std import format.*
main() {
// 无关代码略
var totalScore: Float64
totalScore = 90.0
println(totalScore.format(".2")) // 将浮点数的输出精度指定为小数点后两位
}
经过以上修改,totalScore的输出结果为:
90.00
关于标准库和包的知识将在第13章介绍。
修改2.1.3节的练习代码,通过println函数读取表示停车位编号、童鞋价格、商铺地址编号和空调开关状态的变量值,并在输出浮点类型数据时使用format函数指定输出精度为小数点后两位。
使用关键字let声明的变量是不可变变量,使用关键字var声明的变量是可变变量。
不可变变量 指的是初始化后数据不可以发生改变的变量。对于不可变变量,只可以执行一次“存”操作。 可变变量 指的是初始化数据可以发生改变的变量。对于可变变量,可以执行多次“存”操作。
对于可变变量,可以随时通过赋值表达式来给变量存入新的变量值。在存入新值之后,旧值就会被新值替换。 赋值表达式 的语法格式如下:
变量名 = 新值
其中,“=”是赋值操作符,其作用是将“=”右边的新值赋给左边的变量。赋值完成后,变量值就被新值替换了。
对代码清单2-1进行修改,将可变变量info的值修改为另一个字符串类型的字面量,如代码清单2-3所示。
01 main() {
02 var info: String = "你好,仓颉!"
03 println(info) // 输出变量info并换行
04
05 info = "使用赋值表达式对可变变量进行赋值" // 修改info
06 println(info) // 再次输出info
07 }
编译并执行程序,输出结果为:
你好,仓颉!
使用赋值表达式对可变变量进行赋值
如果对 已经完成初始化的不可变变量 进行赋值,将会引发编译错误。例如,在以上示例程序中,如果在声明info时使用的是关键字let,那么在之后的代码中就不能再对info进行赋值操作。
在仓颉中,表达式是一个宽泛的概念,只要能够返回一个值,就可以将其称为 表达式 (expression)。简单的表达式是由 操作数 和 操作符 构成的,其中操作符是可选的。操作数是参与操作的数据,例如字面量"你好,仓颉!"、变量info。操作符是一种特殊的符号,通过操作符可以对相应数据类型的操作数进行各种操作,例如“+”“()”。
以下是一些简单表达式的示例:
"你好,仓颉!" // 1个字符串类型字面量(操作数)构成的表达式
3 // 1个整数类型字面量(操作数)构成的表达式
x + 1 // 由2个操作数“x”“1”和1个操作符“+”构成的表达式
println(info) // 操作符“()”表示函数调用
info = "笑口常开" // 赋值表达式
赋值表达式中的新值可以是各种表达式,示例代码如代码清单2-4所示。
01 main() {
02 var x = 1
03 println(x)
04
05 x = x + 1 // 新值是表达式x + 1
06 println(x)
07
08 x = x * 3 // 新值是表达式x * 3
09 println(x)
10 }
编译并执行程序,输出结果为:
1
2
6
在示例程序中,首先声明了一个初始值为1的可变变量x(第2行代码)。在第5行代码中,使用以下赋值表达式对x进行赋值:
x = x + 1
在执行该行代码时,首先会计算出“=”右边的表达式的值。由于当前x的值为1,因此计算出表达式x + 1的值为2,再将x + 1的值赋给“=”左边的x,这样就将x的值由1修改为2。
同理,在第8行代码中,使用以下赋值表达式再次修改了x的值:
x = x * 3
在执行该行代码时,同样先使用当前x的值计算出表达式x * 3的值为6,再将6赋给x。
除了可以使用赋值表达式对可变变量进行赋值,还可以使用 复合赋值表达式 对可变变量进行赋值。将其他 二元操作符 ,如“+”“”“*”等,与赋值操作符复合在一起,可以得到复合赋值操作符。对代码清单2-4稍作修改,得到代码清单2-5。
01 main() {
02 var x = 1
03 println(x)
04
05 x += 1 // 等效于x = x + 1
06 println(x)
07
08 x *= 3 // 等效于x = x * 3
09 println(x)
10 }
以上示例程序的输出结果和代码清单2-4的输出结果是完全一致的。
在示例程序中,使用以下2个复合赋值表达式对可变变量x进行赋值:
x += 1
x *= 3
一元操作符只需要1个操作数,例如,3中的负号“”是一元操作符。二元操作符需要2个操作数,例如5 * 3中的乘号“*”是二元操作符。
继续修改2.2.1节的练习代码。
1.使用赋值表达式对表示停车位编号、商铺地址编号和空调开头状态的变量重新赋值。
2.使用赋值表达式对表示童鞋价格的变量重新赋值,使童鞋价格在当前价格的基础上减少19.8元。
3.使用复合赋值表达式对表示童鞋价格的变量重新赋值,使童鞋价格为当前价格的9折(90%)。
在给变量赋值时,要注意表达式的类型必须与变量类型一致,否则将会引发编译错误。示例程序如下:
main() {
var str: String
var num: Int64
str = "123" // 将String类型表达式赋给String类型变量
num = 456 // 将Int64类型表达式赋给Int64类型变量
str = 456 // 编译错误:不能将Int64类型表达式赋给String类型变量
num = "123" // 编译错误:不能将String类型表达式赋给Int64类型变量
}
在以上示例程序中,将String类型的字面量"123"赋给String类型的变量str、将Int64类型的字面量456赋给Int64类型的变量num,这都是可以的。但是如果将Int64类型的字面量456赋给String类型的变量str、将String类型的字面量"123"赋给Int64类型的变量num,就会引发编译错误。读者在编程时,要注意避免这种错误。
如果需要将一个非String类型的表达式赋给String类型的变量,可以使用toString函数将非String类型的表达式转换为String类型。例如,可以将以上示例中对str进行第2次赋值的代码修改为:
str = 456.toString() // str的新值为"456"
如果需要将一个 内容为数值类型字面量的字符串 (简称 数值字符串 )转换为Int64类型,也可以使用相应的函数。
首先,在cj文件的第1行使用以下代码,导入标准库convert包中的所有public顶层声明:
from std import convert.*
然后,使用parse函数将数值字符串转换为Int64类型:
num = Int64.parse("123") // num的新值为123
同理,如果num是一个Float64类型的变量,那么可以使用以下代码将数值字符串转换为Float64类型:
num = Float64.parse("123.5") // num的新值为123.5
修改后的完整示例程序如下:
from std import convert.*
main() {
var str: String
var num: Int64
str = "123"
num = 456
str = 456.toString() // str的新值为"456"
num = Int64.parse("123") // num的新值为123
}
关于parse函数的更多用法,将在第15章中进行介绍。
❏ 学会声明变量。
❏ 学会通过变量名来读取变量值。
❏ 了解String、Int64、Float64和Bool类型的简单用法。
❏ 掌握赋值表达式和复合赋值表达式的用法。
❏ 掌握字符串类型和数值类型相互转换的方法。