跳到主要内容

运算符

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 ++自增 1x ++

示例代码​

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 中的运算符优先级从高到低为:

  1. 括号 ()
  2. 一元运算符 ! - +
  3. 乘法与取余 * / %
  4. 加法与连接 + - ..
  5. 比较 > < >= <= == !=
  6. 逻辑与 &
  7. 逻辑或 |
  8. 空合并 ??
  9. 条件运算符 ? :
  10. 赋值 =

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
}
}

下一步​