basic_data_type
SKILL.md
仓颉语言基本数据类型 Skill
注意:这些基础数据类型都实现了 ToString 接口,都可以直接打印或用于插值字符串,也可以调用
toString成员函数显式转String类型
1. 整数类型
1.1 类型列表
- 有符号整数:
Int8、Int16、Int32、Int64、IntNative - 无符号整数:
UInt8、UInt16、UInt32、UInt64、UIntNative - 有符号 N 位范围:−2^(N−1) ~ 2^(N−1)−1;无符号 N 位范围:0 ~ 2^N−1
IntNative/UIntNative为平台相关宽度- 默认整数类型为
Int64(无上下文时字面量默认推断为Int64)
1.2 整数字面量
- 二进制:
0b或0B前缀,例如0b00011000 - 八进制:
0o或0O前缀,例如0o30 - 十进制:无前缀,例如
24 - 十六进制:
0x或0X前缀,例如0x18 - 允许使用下划线
_分隔:0b0001_1000 - 超出范围的值会导致编译错误
1.3 整数字面量后缀
| 后缀 | 类型 | 后缀 | 类型 |
|---|---|---|---|
i8 |
Int8 | u8 |
UInt8 |
i16 |
Int16 | u16 |
UInt16 |
i32 |
Int32 | u32 |
UInt32 |
i64 |
Int64 | u64 |
UInt64 |
示例:100i8、0x10u64、0o432i32
1.4 字节字面量
- 语法:
b'x',表示UInt8类型的 ASCII 值 - 支持转义:
b'\n'、b'\\' - Unicode 转义:
b'\u{78}'(最多 2 位十六进制,值 < 256)
1.5 整数支持的运算
- 算术运算、位运算、关系运算、自增/自减(
++/--)、复合赋值 - 可在整数类型之间转换、与浮点互转、转换为
Rune
1.6 数值类型转换
- 仓颉使用类型构造函数语法进行数值转换,没有
.toInt64()等方法:let n = Int64(value) // 将其他数值类型转换为 Int64 let u = UInt32(runeValue) // 将 Rune 转换为 UInt32 let f = Float64(intValue) // 将整数转换为 Float64 let r = Rune(intValue) // 将整数转换为 Rune - 字符串解析为数值使用
parse静态方法(需导入std.convert.*):import std.convert.* let n = Int64.parse("42") // 解析失败抛异常 let f = Float64.parse("3.14") // 解析失败抛异常
2. 浮点类型
2.1 类型列表
Float16(二进制16位,约3位有效数字)Float32(二进制32位,约6位有效数字)Float64(二进制64位,约15位有效数字)
2.2 浮点字面量
- 十进制:须有整数部分或小数部分;指数用
e/E(以10为底),例如3.14、2e3、2.4e-1 - 十六进制:
0x/0X前缀;须有指数用p/P(以2为底),例如0x1.1p0、0x1p2
2.3 浮点字面量后缀(仅限十进制)
| 后缀 | 类型 |
|---|---|
f16 |
Float16 |
f32 |
Float32 |
f64 |
Float64 |
注意只有以上三种后缀,没有 f 后缀
2.4 浮点支持的运算
- 算术运算、关系运算、复合赋值
- 不支持 自增/自减(
++/--) - 可在浮点类型间转换,也可与整数类型互转
3. 布尔类型
- 类型:
Bool - 字面量:
true、false - 支持运算符:
- 逻辑运算:
!(非)、&&(与)、||(或) - 关系运算:
==、!= - 复合赋值:
&&=、||=
- 逻辑运算:
4. 字符类型(Rune)
- 类型:
Rune,表示所有 Unicode 字符 - 字面量前缀为
r,后跟单引号或双引号
三种字面量形式
- 单字符:
r'a'、r"b" - 转义字符:
r'\\'、r'\n'、r'\t' - Unicode 字符:
r'\u{4f60}'(1~8 位十六进制)
支持的运算
- 关系运算:
<、>、<=、>=、==、!=(比较 Unicode 值) Rune→UInt32转换;任意整数类型 →Rune转换Rune不支持算术运算(+、-、*、/等均不可用),需要先转换为整数类型再计算:// 错误:Rune 不支持减法 // let diff = c - r'0' // 编译错误 // 正确:先转换为 UInt32 let diff = UInt32(c) - UInt32(r'0') // 计算结果可通过 Rune(intValue) 转换回 Rune let nextChar = Rune(UInt32(c) + 1)
5. 字符串类型
- 类型:
String,Unicode 字符序列
5.1 三类字面量
- 单行字符串:用
'...'或"..."包围。不可含未转义的匹配引号或单独的\。须在一行内。 - 多行字符串:用
"""..."""或'''...'''包围。内容从第一个换行后开始。可跨行。支持转义。 - 多行原始字符串:
#"..."#、##'...'##等。起止#数量须匹配。不进行转义处理。
5.2 隐式转换
- 当左侧为
Byte(UInt8别名)且右侧为 ASCII 字符串字面量时,可隐式转换为Byte - 当左侧为
Rune且右侧为单字符字符串字面量时,可隐式转换为Rune
5.3 字符串插值
- 语法:
"text ${expression} text" ${}中可包含声明和表达式;使用{}中的最后一个值- 不适用于 原始字符串字面量
5.4 支持的运算
- 关系运算符用于比较
+用于拼接
5.5 字符串迭代
for (c in s)迭代的是字节(UInt8/Byte),因为String实现了Collection<Byte>(UTF-8 编码字节序列)for (c in s.runes())迭代的是字符(Rune),返回Iterator<Rune>- 这与大多数编程语言的行为不同,需要特别注意:
// c 是 UInt8 类型(字节) for (c in "你好") { ... } // c 是 Rune 类型(Unicode 字符) for (c in "你好".runes()) { ... } toRuneArray()方法可将字符串转换为Array<Rune>
6. Unit 类型
- 类型:
Unit - 唯一值/字面量:
() - 用于仅产生副作用的表达式:
print、赋值、复合赋值、自增/自减、循环 - 仅支持:赋值、
==、!=
7. Nothing 类型
- 类型:
Nothing - 不包含任何值
- 是所有类型的子类型(包括
Unit) - 是
break、continue、return、throw表达式的类型 - 这些表达式之后的代码不可达
return须在函数体内使用;break/continue须在循环内使用- 目前不能作为显式类型标注使用
8. 元组类型
- 语法:
(T1, T2, ..., TN),最少 2 个元素 - 固定长度,元素不可变(但
var声明的元组变量本身可重新赋值) - 字面量:
(e1, e2, ..., eN)
8.1 元素访问
t[index],index为编译时整数字面量,从 0 开始- 越界索引导致编译错误
8.2 具名类型参数
(name: String, price: Int64)— 所有参数须全部具名或全部不具名- 名称仅在类型层面有效;不能用作访问器
8.3 元组相等性
==/!=仅在所有元素类型都支持==/!=时可用- 两个元组相等当且仅当所有对应元素相等
8.4 多元赋值
(a, b) = (1, 2)— 并行赋值(a, b) = (b, a)— 交换_忽略某个位置:(a, _) = (3, 4)
9. 数组类型
9.1 Array<T>
- 有序、单元素类型集合,固定长度(不支持增删)
Array<T>是 struct 类型,但内部通过引用共享数据 —let arr2 = arr1后两者共享底层存储,修改互相可见- 字面量:
[e1, e2, ...];空数组:[](需要类型上下文) - 构造方式:
Array<Int64>()— 空数组Array<Int64>(3, repeat: 0)— 3 个元素全为 0Array<Int64>(3, {i => i + 1})— lambda 初始化
- 访问:
arr[i](Int64索引,从 0 开始);负数或越界 → 编译错误或运行时异常 - 切片:
arr[0..5]、arr[..3]、arr[2..](使用 Range) - 修改:
arr[0] = 3,元素可修改 .size属性获取元素数量- 可用
for (i in arr)迭代
9.2 VArray<T, $N>(值类型)
- 值类型固定长度数组:
VArray<T, $N> $N为字面量Int64长度;<T, $N>不可省略- 限制:元素类型
T不能包含引用类型、枚举、lambda(CFunc除外)或未实例化的泛型 - 字面量初始化:
var a: VArray<Int64, $3> = [1, 2, 3] - 构造方式:
VArray<Int64, $5>({i => i})— lambda 初始化VArray<Int64, $5>(repeat: 0)— 重复初始化
a[i]访问/修改;.size获取长度- 比
Array的 GC 压力小,但赋值时复制(避免在性能敏感代码中使用大型 VArray) - 支持 C 互操作
10. 区间类型(Range)
- 泛型类型:
Range<T>(T 须支持关系运算和与Int64的加法) - 包含
start、end(类型 T)、step(Int64,不能为 0) - 构造函数:
Range<T>(start, end, step, hasStart, hasEnd, isClosed)
10.1 区间字面量
- 半开区间(左闭右开):
start..end : step— 不包含end - 闭区间(左闭右闭):
start..=end : step— 包含end step省略时默认为 1;step不能为 0
10.2 空区间
start..end : step为空:当step > 0 && start >= end或step < 0 && start <= endstart..=end : step为空:当step > 0 && start > end或step < 0 && start < end
11. 基本运算符
11.1 赋值运算符 =
- 先计算右侧,再计算左侧,然后赋值
- 赋值表达式的类型为
Unit(值为()) - 不支持链式赋值:
a = b = 0是语法错误 - 多元赋值:
(a, b) = (1, 2);(a, b) = (b, a)用于交换;_忽略
11.2 算术运算符
| 运算符 | 说明 | 操作数类型 |
|---|---|---|
-(一元) |
取负 | 数值类型 |
+ |
加(也用于字符串拼接) | 相同数值类型 |
- |
减 | 相同数值类型 |
* |
乘 | 相同数值类型 |
/ |
除(整数除法向零截断) | 相同数值类型 |
% |
取模 a - b*(a/b) |
仅整数 |
** |
幂 | Int64^UInt64→Int64,`Float64^(Int64 |
- 溢出会被检测并报错(运行时错误)
11.3 复合赋值运算符
**=、*=、/=、%=、+=、-=、<<=、>>=、&=、^=、|=、&&=、||=
11.4 关系运算符
==、!=、<、<=、>、>=
11.5 逻辑运算符
| 运算符 | 说明 | 短路求值 |
|---|---|---|
! |
非(一元前缀) | 不适用 |
&& |
与 | 是:false && x → false |
| ` | ` |
11.6 位运算符(仅整数类型)
| 运算符 | 说明 |
|---|---|
!(一元) |
按位取反 |
<< |
左移(低位补 0) |
>> |
右移(无符号补 0;有符号正数补 0,负数补 1) |
& |
按位与 |
^ |
按位异或 |
| |
按位或 |
- 移位量须为非负且小于操作数位宽
11.7 自增/自减运算符
expr++/expr--— 仅后缀,仅整数类型- 等价于
expr += 1/expr -= 1 - 结果类型为
Unit(不能用作值)
11.8 合并运算符 ??
- 用于
Option<T>解包 e1 ?? e2:若e1为Some(v)→v(短路,e2不求值);若None→e2??的优先级很低(16),低于比较运算符(==/!=为 10,</>为 9),混合使用时须加括号:
let opt: ?Int64 = 42
let value = 10
// ❌ 错误:?? 优先级低于 !=,实际解析为 opt ?? (default != value)
// if (opt ?? default != value) { ... }
// ✅ 正确:使用括号明确优先级
if ((opt ?? 0) != value) { ... }
11.9 区间运算符
..— 半开区间(左闭右开)..=— 闭区间(左闭右闭)- 可选步长
: step
11.10 运算符优先级表
优先级数值越小,优先级越高。
| 优先级 | 运算符 | 含义 | 结合方向 |
|---|---|---|---|
| 0 | @ |
宏调用 | 右结合 |
| 1 | . [] () |
成员访问、索引、函数调用 | 左结合 |
| 2 | ++ -- ? |
自增、自减、问号操作符 | 无 |
| 3 | ! -(一元) |
按位取反/逻辑非、一元负号 | 右结合 |
| 4 | ** |
幂运算 | 右结合 |
| 5 | * / % |
乘、除、取模 | 左结合 |
| 6 | + - |
加、减 | 左结合 |
| 7 | << >> |
按位左移、右移 | 左结合 |
| 8 | .. ..= |
区间操作符 | 无 |
| 9 | < <= > >= is as |
比较、类型检查/转换 | 无 |
| 10 | == != |
判等、判不等 | 无 |
| 11 | & |
按位与 | 左结合 |
| 12 | ^ |
按位异或 | 左结合 |
| 13 | | |
按位或 | 左结合 |
| 14 | && |
逻辑与 | 左结合 |
| 15 | || |
逻辑或 | 左结合 |
| 16 | ?? |
coalescing 操作符 | 右结合 |
| 17 | |> ~> |
pipeline、composition | 左结合 |
| 18 | = += -= *= 等 |
赋值、复合赋值 | 无 |
常见陷阱:
??在优先级 16,远低于==/!=(10)和</>(9),因此opt ?? default != value会被解析为opt ?? (default != value),而非(opt ?? default) != value。混用时须加括号。
Weekly Installs
2
Repository
kong-baiming/cangjie-devFirst Seen
3 days ago
Installed on
amp1
cline1
opencode1
cursor1
kimi-cli1
codex1