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。
● 商场中央空调的当前开关状态为“关”。