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%)。