仓颉编程快速上手
上QQ阅读APP看书,第一时间看更新

2.1.2 声明几个不同类型的变量

声明变量的语法格式如下:

let|var 变量名[: 数据类型] [= 初始值]

提示

这是本书中出现的第1个语法说明,本书后续出现的所有语法说明都遵循以下约定:

粗体字部分表示关键字,它的写法是固定不变的,如关键字“let”“var”;非粗体字部分表示需要根据需求填写,如“变量名”“数据类型”等。

符号“|”表示多个并列的关键字,只能取其中一个,如关键字“let”和“var”只能二选一。

由一对方括号“[]”括起来的部分表示是可选的,即该部分不是必须填写的,如“[: 数据类型]”和“[= 初始值]”。

为了提高程序代码的可读性,建议在某些符号(如“:”“,”)后面加上一个空格,在某些操作符(如“=”“+”)的前后各加上一个空格。多多观察示例程序,可以帮助你很快了解这些编程规范。

仓颉使用关键字let或var来声明变量,其中,let声明的是不可变变量,var声明的是可变变量(两者的区别详见2.2节)。

1.变量名

在关键字之后,就是自定义的变量名。变量名是一种标识符。在程序中,可以通过变量名来访问变量。

仓颉程序中的变量名、函数名、类型名等,都属于标识符。标识符命名必须遵循以下命名规则。

一个合法的标识符名称可以有两种开头:一种是以一个英文字母开头,另一种是以任意数量连续的下画线(_)加上一个英文字母作为开头。标识符名称的开头后可以是任意长度的英文字母、数字或下画线。

不可以使用关键字作为标识符。

区分大小写,如info和Info是两个不同的标识符。

符合命名规则的标识符名称,被称为合法标识符;不符合命名规则的标识符名称,被称为非法标识符。如果程序中包含非法标识符,将会导致编译错误。

以下是一些合法标识符的示例:

x             // 以英文字母开头
gate9         // 以英文字母开头,之后是英文字母和数字
gate_9        // 以英文字母开头,之后是英文字母、数字和下画线
gate9_        // 以英文字母开头,之后是英文字母、数字和下画线
x1_y1_z1      // 以英文字母开头,之后是英文字母、数字和下画线
_x            // 以一个下画线和英文字母开头
_x1_y1_z1     // 以一个下画线和英文字母开头,之后是数字、下画线和英文字母等
__x           // 以两个下画线和英文字母开头

以下是一些非法标识符的示例:

9gate  // 以数字开头
class  // class是关键字

除了必须遵循的命名规则,我们还建议在给标识符命名时使用一个或多个有意义的单词组合,做到“见名知意”。

变量的命名也需要遵循以上规则。另外,对于一般的变量,推荐使用小驼峰命名风格来命名,即如果变量名由多个单词构成,那么第一个单词的首字符小写,后面每个单词的首字符大写,其余字符都小写,中间不使用下画线。举例如下:

teacherName    // 教师姓名
ageOfStudent   // 学生年龄
totalScore     // 总分
isScorePassed  // 分数是否通过

2.数据类型

数据类型表示变量存储的是何种类型的数据。在声明变量时要确定变量的数据类型,并且变量的数据类型在声明之后不可以被更改。仓颉本身内置了多种数据类型,并且也支持自定义数据类型。下面介绍4种常用的基本数据类型,先声明以下4个变量:

main() {
let teacherName: String = "刘玥"
var ageOfStudent: Int64 = 19
var totalScore: Float64
var isScorePassed: Bool
}

接下来,让我们来逐行解释一下。

let teacherName: String = "刘玥"

以上代码声明了一个String类型的变量teacherName。String类型(也被称为字符串类型)在前面的示例中已经出现过,用于存储文本内容。显然,教师的姓名属于文本内容,所以将该变量声明为String类型。

var ageOfStudent: Int64 = 19

以上代码声明了一个Int64类型的变量ageOfStudent。Int64类型是众多整数类型中最常用的一种,用于存储整数。除非是一些特殊的场景,在一般情况下,学生的年龄应该是整数,所以可以将其声明为整数类型。

var totalScore: Float64

以上代码声明了一个Float64类型的变量totalScore。Float64类型是一种常用的浮点类型,用于存储具有小数部分的实数。这里我们将表示总分的变量 totalScore 定义为浮点类型,即认为总分是可以带小数的。当然,如果在程序设定中总分是整数,那么也可以将变量 totalScore定义为整数类型。

var isScorePassed: Bool

最后这行代码声明了一个Bool类型(布尔类型)的变量isScorePassed。布尔类型用于表示逻辑中的,只有两个字面量:true和false。布尔类型在程序中常用于表示两种互斥的状态。例如,isScorePassed用于表示分数通过(true)和分数不通过(false)这两种互斥的状态。

3.初始值

仓颉要求每个变量在使用前必须完成初始化,否则会引发编译错误。例如,在以下示例代码中,在声明变量totalScore时没有指定初始值,并且之后也没有对totalScore进行初始化,就直接使用println访问了totalScore,导致编译错误。

main() {
    var totalScore: Float64
println(totalScore)  // 编译错误:变量totalScore在使用时没有初始化
}

如果要避免上述错误,可以在声明时给totalScore指定初始值,或者在声明之后使用赋值表达式对totalScore进行初始化。例如,可以将以上代码修改为:

main() {
var totalScore: Float64 = 0.0  // 在声明时对变量进行初始化
    println(totalScore)
}

在一般情况下,仓颉要求在声明变量时就对变量进行初始化,仅在一些特定的情况下才可以在声明变量时缺省(省略不写)初始值。例如,对于局部变量,如上述代码中的totalScore,仓颉允许在定义时不对该变量进行初始化(此时必须指明数据类型),但是在变量第一次被读取之前,必须完成初始化工作。可以使用如下的赋值表达式对变量进行初始化:

变量名 = 初始值

其中,“=”是赋值操作符,其作用是将“=”右边的初始值赋给左边的变量。

针对上面的示例,如果在声明之后对totalScore进行初始化,可以将代码修改为:

main() {
    var totalScore: Float64
totalScore = 0.0  // 使用赋值表达式对变量进行初始化
    println(totalScore)
}

提示

局部变量的概念将在6.3节进行详细介绍。目前,读者只需要知道在main中定义的变量都属于局部变量即可。

练习

在一个商场管理软件中,有以下4种数据需要存储,请读者分别为它们定义对应的变量,注意选择合适的数据类型,以及简短的、具有描述性的变量名。

停车场的停车位编号。假定该商场的停车场总共只有一层一个分区,停车位编号范围为1~1000号。当前车位编号为668号。

儿童用品区的一双童鞋的价格为99.8元。

某商铺在商场中的地址编号为1-16A。

商场中央空调的当前开关状态为“关”。