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的数组。