5.2. 数组
数组类型的基本声明如下:
[N]T
其中,N
为数组长度(大等于0常整数),T
为数组元素类型;例如:
a: [3]i32
a[0] = 42
println(a[0]) // 42
与很多语言类似,凹语言使用 x[M]
语法访问数组内的指定元素。数组变量声明时,可使用以下方式设定数组元素初始值:
a: [3]i32 =
println(a[0], a[1], a[2]) // 13 42 9527
[3]i32{13, 42, 9527}
声明了一个数组字面值,因此上例中数组变量 a
的声明可以使用快捷声明简化为:
a := [3]i32{13, 42, 9527}
声明数组字面值时,其后 {}
内所含元素的个数可以小于数组长度(但不可大于),不足的部分为 0 值,例如:
a := [3]i32{13, 42}
println(a[2]) // 0
内置函数 len
可用于获取数组长度既数组中所含元素的个数,例如:
a := [3]i32
println(len(a)) // 3
声明数组字面值时,若数组长度部分写为 ...
,则表明数组长度由其后 {}
内的元素个数决定,例如:
a := [...]i32{13, 42}
println(len(a)) // 2
在凹语言中数组是值类型,例如:
a := [...]i32{13, 42}
b: [2]i32
b = a
println(b[0], b[1]) // 13 42
b[0] = 9527
println(a[0]) // 13
由此可见,将一个数组赋值给另一个数组时,会将其中的每个对应元素都进行赋值,既执行深拷贝操作。由于数组是值,赋值后的数组间不存在相互关联。
元素类型相同,但长度不同的数组,被认为是不同的类型,因此下列程序非法:
a: [2]i32
b: [3]i32
b = a // 非法,类型不同不可赋值
已知问题:
- 通过变量下标访问数组元素时,未执行边界检查。该问题不影响语法兼容性,后续对本问题的修正不影响已有源代码,凹程序开发者无须对此进行特别处理。
- 在目前版本的实现中,数组被展开为一组线性值,因此数组赋值时,虚拟寄存器和指令数与数组长度成整倍数关系,若长度过大,目标代码的体积会急剧膨胀。该问题不影响语法兼容性,后续对本问题的修正不影响已有源代码,在现阶段,程序开发者应关注:除全局变量外,尽可能不要使用长度大于8的数组。