购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

2.2 变量的使用

在完成对变量的初始化之后,就可以使用变量了。对变量的使用包括读取和存入两种操作。

2.2.1 读取变量值

当我们需要使用变量中存储的数据时,可以 通过变量名 来读取变量值。示例程序如代码清单2-2所示。

代码清单2-2 read_variables.cj
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函数指定输出精度为小数点后两位。

2.2.2 对可变变量进行赋值

使用关键字let声明的变量是不可变变量,使用关键字var声明的变量是可变变量。

不可变变量 指的是初始化后数据不可以发生改变的变量。对于不可变变量,只可以执行一次“存”操作。 可变变量 指的是初始化数据可以发生改变的变量。对于可变变量,可以执行多次“存”操作。

对于可变变量,可以随时通过赋值表达式来给变量存入新的变量值。在存入新值之后,旧值就会被新值替换。 赋值表达式 的语法格式如下:

变量名 = 新值

其中,“=”是赋值操作符,其作用是将“=”右边的新值赋给左边的变量。赋值完成后,变量值就被新值替换了。

1.赋值表达式中的新值是字面量

对代码清单2-1进行修改,将可变变量info的值修改为另一个字符串类型的字面量,如代码清单2-3所示。

代码清单2-3 hello_cangjie.cj
01   main() {
02       var info: String = "你好,仓颉!"
03       println(info)  // 输出变量info并换行
04   
05       info = "使用赋值表达式对可变变量进行赋值"  // 修改info
06       println(info)  // 再次输出info
07   }

编译并执行程序,输出结果为:

你好,仓颉!
使用赋值表达式对可变变量进行赋值

如果对 已经完成初始化的不可变变量 进行赋值,将会引发编译错误。例如,在以上示例程序中,如果在声明info时使用的是关键字let,那么在之后的代码中就不能再对info进行赋值操作。

2.赋值表达式中的新值是表达式

在仓颉中,表达式是一个宽泛的概念,只要能够返回一个值,就可以将其称为 表达式 (expression)。简单的表达式是由 操作数 操作符 构成的,其中操作符是可选的。操作数是参与操作的数据,例如字面量"你好,仓颉!"、变量info。操作符是一种特殊的符号,通过操作符可以对相应数据类型的操作数进行各种操作,例如“+”“()”。

以下是一些简单表达式的示例:

"你好,仓颉!"      // 1个字符串类型字面量(操作数)构成的表达式
3                 // 1个整数类型字面量(操作数)构成的表达式
x + 1             // 由2个操作数“x”“1”和1个操作符“+”构成的表达式
println(info)     // 操作符“()”表示函数调用
info = "笑口常开"  // 赋值表达式

赋值表达式中的新值可以是各种表达式,示例代码如代码清单2-4所示。

代码清单2-4 write_variables.cj
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。

3.复合赋值表达式

除了可以使用赋值表达式对可变变量进行赋值,还可以使用 复合赋值表达式 对可变变量进行赋值。将其他 二元操作符 ,如“+”“”“*”等,与赋值操作符复合在一起,可以得到复合赋值操作符。对代码清单2-4稍作修改,得到代码清单2-5。

代码清单2-5 write_variables.cj
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%)。

2.2.3 在赋值时避免类型错误

在给变量赋值时,要注意表达式的类型必须与变量类型一致,否则将会引发编译错误。示例程序如下:

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类型的简单用法。

掌握赋值表达式和复合赋值表达式的用法。

掌握字符串类型和数值类型相互转换的方法。 +XBp7UNZhD1nIxBVo75ZYmGUMTyAnolAFBRDUupKUdbQqsIC7dFtQ+45fUagS2Wl

点击中间区域
呼出菜单
上一章
目录
下一章
×