Covariant Script 类型系统
1.1 定义变量
var 变量名 = 表达式, 变量名 = 表达式...
定义一个或多个变量,初始值为表达式的值
link 变量名 = 表达式, 变量名 = 表达式...
定义一个或多个引用,引用到表达式的值
constant 常量名 = 表达式, 常量名 = 表达式...
常量和变量的处理方式完全不同,常量类似于 C++中的 constexpr
其实际上仅存在于编译期。使用常量将有利于提高性能,编译器在某些情况下也会自动进行常量折叠,但显式声明将帮助编译器更进一步优化您的程序
请尽量谨慎使用常量,复杂常量的行为取决于实现
CovScript的变量系统中存在三种形式,分别为变量、引用和指针。变量和引用往往可以互相转化
形式 | 赋值(=) | 绑定(:=) | 声明方法 |
---|---|---|---|
变量 | 更改其内存区域的值 | 将变量绑定到其他内存区块上当内存区块共享时,演变为引用 | var语句 |
new表达式 | |||
引用退化 | |||
引用 | 更改其引用到的区域的值 | 将引用绑定至其他内存区块上当内存区块独立时,退化为变量 | link语句 |
函数参数 | |||
变量演变 | |||
指针 | 更改其指向的内存区块 | 视同变量 | gcnew表达式 |
取址(&)表达式 |
关于绑定的更多信息,参考 绑定表达式
1.2 number(数值)类型
number
的字面量由0~9
十个数和小数点组成,如 12
,3.14
等
number
表示的数仅限于全体实数
number
的初始值为0
1.3 boolean(逻辑)类型
boolean
的字面量只有两个,分别是 true
(真)和 false
(假)
boolean
的初始值为 true
(真)
1.4 pointer(指针)类型
pointer
没有字面量
pointer
指向存储在堆空间中的对象,可使用gcnew
运算符新建一个堆上对象
pointer
的初始值为null
(空指针),null
(空指针)指向一个无意义的对象,不允许解引用一个空指针。不再使用的对象将由
GC(垃圾回收器)自动回收。可使用解引用运算符访问指针指向的对象,若指针指向的是结构体实例,可使用箭头运算符访问结构体的成员
1.5 char(字符)类型
char
的字面量是由单引号括起的单个字符,如'A'
, 'b'
, '+'
等
特殊符号需使用转义序列来表示:
转义序列 | 符号 |
---|---|
\a | 响铃 |
\b | 退格 |
\f | 换页 |
\n | 换行 |
\r | 回车 |
\t | 水平制表 |
\v | 垂直制表 |
\\ | 反斜杠 |
\' | 单引号 |
\“ | 双引号 |
\0 | 空字符 |
char
的初始值为 '\0'
(空字符)
1.6 string(字符串)类型
string
的字面量是由双引号括起的任意个数字符,如“Hello”
string
的初始值为”“(空串)
可使用下标运算符访问字符串中的字符,下标不能超出范围(字符串长度-1),小于零时即为倒序访问。多段字符串可以使用加运算符连接
字符串后可跟字面量名,如“0xff”hex
,称为字符串字面量。用法详见 注册字面量【待修复】
可以使用 to_string()
函数将其他类型转换至字符串:
类型 | 规则 |
---|---|
number | 按字面量转换,精度遵循iostream.setprecision【待修复】的设置 |
1.7 array(数组)类型
array
的字面量为大括号扩起的以逗号分隔的任意个数元素,如 {1,2,3}
array
是一种元素均匀分布的顺序容器,初始值为{}
(空数组)
可使用下标运算符访问数组中的元素,下标小于零时即为倒序访问
Covariant Script 编程语言的数组是变长数组(VLA),若下标超出范围数组将自动增长,增长的部分自动填0
1.8 list(线性表)类型
list
没有字面量
list
是一种元素不均匀分布的顺序容器
list
的初始值为空表
1.9 pair(映射)类型
pair
的字面量为冒号对应的一个键值对,如2:3
pair
的初始值为0:0
(空映射)
1.10 hash_map(哈希表)类型
hash_map
没有字面量
hash_map
是一种元素均匀分布的无序容器
hash_map
要求其存储的映射的键的类型必须支持生成哈希值
hash_map
的初始值为空表
可使用下标运算符访问散列表中的键对应的值,若键不存在,将自动建立键与0组成的映射。
也可以使用点运算符访问散列表中的字符串键对应的值,如与散列表扩展函数冲突则被忽略,若键不存在将触发运行时错误
例如,map[“hello”]
可使用 map.hello
代替,但 map.hello
不会自动新建映射,而 map[“hello”]
会。