我们已经讨论了 塞耶龙运算符的理论,但我遗漏了给出它们的实际列表。在编制这个运算符列表时,我们试图选择那些使代码更容易阅读而不是更难阅读的运算符。 (塞耶龙应该是一种避免ASCII艺术的编程语言。) 列表中有一两个运算符我有些怀疑,特别是 格式运算符,$,它用于将对象格式化为字符串。
运算符优先级
塞耶龙比Java有更多的运算符,并且由于 运算符多态,它们在某些方面更加灵活,因此我们决定将运算符分类为 层
,以使它们更容易获得一致的前缀。根据语言规范
有15个不同的运算符优先级级别,但这些级别被组织成层,以便更容易预测。在每个层内,后缀运算符的优先级高于前缀运算符,前缀运算符的优先级高于二元运算符。有一个例外是:二元指数运算符**的优先级高于前缀运算符+和-。这是因为以下表达式应该是等效的
- 第一层的运算符生成、转换和组合值。
- 第二层的运算符比较或断言值,产生一个布尔结果。
- 第三层的运算符是逻辑运算符,它对布尔参数进行操作以产生一个布尔值。
- 第四层的运算符执行赋值。
-x**2 //means -(x**2)0 - x**2 //means 0 - (x**2)
当然,传统的规则,如
-
乘法
运算符*, /,和%的优先级高于加法
运算符+和-,和 - 的优先级高于
合取
运算符&&和&的优先级高于析取
运算符||, |和^
的规则也受到尊重。
在大多数情况下,这些规则会产生与C、Java和C#中相同的相对运算符优先级。但有一个例外需要注意。逻辑非运算符!在C中的优先级很高,但在Ceylon中的优先级很低(因为它属于第3层)。
现在,最后,这是列表,省略了复合赋值运算符,例如+=。(此列表不是按优先级顺序分类的。)
基本调用和赋值运算符
- 选择lhs.member
- 调用lhs(x,y,z),或lhs { x=x; y=y; z=z; }
- 赋值lhs := rhs
- 格式化$rhs
相等性和比较运算符
- 相同lhs === rhs
- 等于lhs == rhs
- 不等于lhs != rhs
- 比较lhs <=> rhs
- 较小lhs < rhs
- 较大lhs > rhs
- 小等于lhs <= rhs
- 大等于lhs >= rhs
- 在lhs in rhs
- 是lhs is Rhs
- 满足Lhs satisfies Rhs
逻辑运算符
- 非!rhs
- 条件或lhs||rhs
- 条件与lhs&&rhs
处理null值的运算符
- 存在lhs exists
- 非空lhs nonempty
- 默认lhs ? rhs
- Nullsafe选择lhs?.member
对应和序列运算符
- 查找lhs[index]
- Nullsafe查找lhs?[index]
- 子范围lhs[x..y]
- 上界范围lhs[x...]
- 展开成员lhs[].member
创建对象的运算符
- 范围lhs .. rhs
- 条目lhs -> rhs
算术运算符
- 后继++rhs
- 前驱--rhs
- 递增lhs++
- 递减lhs--
- 正数+rhs
- 负数-rhs
- 求和lhs + rhs
- 差lhs - rhs
- 乘积lhs * rhs
- 商lhs / rhs
- 余数lhs % rhs
- 幂lhs ** rhs
位运算符
- 补码~rhs
- 或lhs | rhs
- 与lhs & rhs
- 异或lhs ^ rhs
- 补码在内lhs ~ rhs
请注意,位运算符适用于集合以及二进制字符串,如此处简要讨论。因此,集合的并集写作U|V,集合的交集U&V,以及集合的补集U~V.