运算符
Alia 的运算符覆盖算术、逻辑、空合并、条件、比较、括号与字符串连接。
1. 四则运算
| 运算符 | 描述 | 示例 |
|---|---|---|
+ | 加法 | 1 + 2 → 3 |
- | 减法 | 5 - 3 → 2 |
* | 乘法 | 2 * 3 → 6 |
/ | 除法 | 6 / 2 → 3 |
% | 取余 | 7 % 3 → 1 |
除数为零的除法与取余触发除零错误。
2. 逻辑运算
| 运算符 | 描述 | 示例 |
|---|---|---|
& | 逻辑与 | true & false → false |
| | 逻辑或 | true | false → true |
! | 逻辑非 | !true → false |
一元 - 与 + 可作为前缀运算符,如 -5。
3. 条件与空合并
| 运算符 | 描述 | 示例 |
|---|---|---|
? : | 三元条件 | (true ? 'yes' : 'no') → 'yes' |
?? | 空合并,左值非空时返回左值,否则返回右值 | (null ?? 'fallback') → 'fallback' |
三元条件的测试位为 Null 时触发类型错误。
4. 大小比较
| 运算符 | 描述 | 示例 |
|---|---|---|
> | 大于 | 5 > 3 → true |
< | 小于 | 3 < 5 → true |
>= | 大于等于 | 5 >= 5 → true |
<= | 小于等于 | 3 <= 5 → true |
!= | 不等于 | 5 != 3 → true |
== | 等于 | 5 == 5 → true |
六个比较运算符处于同一优先级。
5. 运算顺序
括号 () 决定运算顺序,括号内表达式优先求值。
print (1 + 2) * 3
print 1 + (2 * 3)
首行求值为 9,次行求值为 7。
6. 字符串连接
.. 运算符连接左右操作数并返回 String,数值操作数按字符串化参与连接,优先级与 + - 同级。
print 'Hello' .. ' ' .. 'World' .. '!'
print 1 .. 2
首行求值为 'Hello World!',次行求值为 '12'。
7. 赋值与自增
= += ++ 用于赋值与自增语句,不作为表达式运算符。
| 形式 | 描述 | 示例 |
|---|---|---|
let x = v | 声明变量 | let x = 10 |
const x = v | 声明常量 | const x = 10 |
x = v | 变量赋值 | x = 15 |
x += v | 增加并赋值 | x += 5 |
x ++ | 自增 1 | x ++ |
示例代码
const a = 10
const b = 5
print 'a + b = ' .. (a + b)
print 'a - b = ' .. (a - b)
print 'a * b = ' .. (a * b)
print 'a / b = ' .. (a / b)
print 'a % b = ' .. (a % b)
const c = true
const d = false
print 'c & d = ' .. (c & d)
print 'c | d = ' .. (c | d)
print '!c = ' .. (!c)
print 'a > b = ' .. (a > b)
print 'a < b = ' .. (a < b)
print 'a == b = ' .. (a == b)
print 'a != b = ' .. (a != b)
const age = 18
print (age >= 18 ? '成年人' : '未成年人')
const myName = 'Alice'
print 'Hello, ' .. myName .. '!'
let x = 10
print 'x = ' .. x
x += 5
print 'x += 5 = ' .. x
x ++
print 'x ++ = ' .. x
const m = null
print m ?? 'fallback'
print (null ?? 'fallback')
print (true ? 'yes' : 'no')
运算符优先级
Alia 中的运算符优先级从高到低为:
- 括号
() - 一元运算符
!-+ - 乘法与取余
*/% - 加法与连接
+-.. - 比较
><>=<===!= - 逻辑与
& - 逻辑或
| - 空合并
?? - 条件运算符
? : - 赋值
=
Value 操作限制与 Null 处理
未收窄的 <Value> 参与以下操作触发类型错误 TYPE_VALUE_OPERATION,收窄方式为 typeOf 与 Ok 与 as:
- 算术运算
+-*/% - 逻辑运算
&|与一元运算!一元- - 条件判断
if与while与for的条件 each目标与索引访问value[...]与属性访问value.prop- 与另一个非字面量值的比较
==!=<><=>=
以下情形为合法动态桥接:
- 与字面量比较
value == 42与42 == value均允许 call value.valueOf解包底层原始值并返回原类型
.. 与 ?? 不触发该限制,.. 恒返回 String,?? 按左右类型合并推断。
Null 为独立类型,除 ?? 外,以 Null 为操作数的二元与一元运算立即报错,三元测试位为 Null 时报错,除数为零时报错,?? 为处理可能为 Null 值的安全路径。
alias process <Value data> -> Value {
if typeOf data == 'Number' {
data * 2
} else {
data
}
}