# 操作符优先级

aardio 操作符优先级与 C系语言基本兼容，唯一的区别是：位运算符优先级略高于等式、不等式运算符。从而保证各组运算符的优先级更加有序、并容易记忆。  

> 试图记住所有的运算符优先级是不必要的，建议在易于混淆优先级的位置用括号明确标明优先级。

### 一. 成员符、括号、乘方  

| 操作符 | 优先级 | 结合 | 说明 |
| --- | --- | --- | --- |
| 成员操作符`.`<br>下标操作符 `[]` <br>直接下标 `[[]]`<br>调用操作符 `()` <br>元表操作符 `@` | 1 | 左向右 | `.` 、`[]`、 `[[]]` <br>都是用于访问对象成员的操作符。<br><br>调用操作符用于调用函数<br>或类构造函数，例如 <br>`print("参数")` 。 |
| () | 2 | 左向右 | 用于组合表达式并改变优先级。 |
| `**` | 3 | 右向左 | 乘方运算 |

### 二. 单目运算符

| 操作符 | 优先级 | 结合 | 说明 |
| --- | --- | --- | --- |
| `!` | 4 | 左向右 | 逻辑非 |
| not | 5 | 左向右 | 逻辑非 |
| `-` | 6 | 左向右 | 取负 |
| `~` | 7 | 左向右 | `~` 按位取反 |

### 三. 算术运算符  

| 操作符 | 优先级 | 结合 | 说明 |
| --- | --- | --- | --- |
| `*`乘 `/`除 `%`取模 | 8 | 左向右 |  |
| `+`加 `-`减 | 9 | 左向右 |  |

### 四. 按位运算符

| 操作符 | 优先级 | 结合 | 说明 |
| --- | --- | --- | --- |
| `<<` 按位左移 <br>`>>` 按位右移 <br>`>>>`无符号右移 | 10 | 左向右 |  |
| `&`按位与 <br>`^`按位异或 <br>&#x7c; 按位或 | 11 | 左向右 | C 语言中位运算符的优先级<br>低于`==`、`!=` |

### 五. 连接运算符  

| 操作符 | 优先级 | 结合 | 说明 |
| --- | --- | --- | --- |
| `++` | 12 | 右向左 | 连接运算符 |

### 六. 关系运算符  

| 操作符 | 优先级 | 结合 | 说明 |
| --- | --- | --- | --- |
| `<`小于 <br>`<=`小于等于 <br>`>=`大于等于 <br>`>`大于 | 13 | 左向右 |  |

### 七. 逻辑运算符  

| 操作符 | 优先级 | 结合 | 说明 |
| --- | --- | --- | --- |
| `==` <br>`!=` <br>`===` <br>`!==` | 14 | 左向右 | 等于、不等于、恒等、非恒等于 |
| `&&` and | 15 | 左向右 | 逻辑与 |
| &#x7c;&#x7c; <br>or | 16 | 左向右 | 逻辑或 |
| `?` | 17 | 左向右 | 逻辑与、该运算符类似于and但优先级更低 |
| `:` | 18 | 左向右 | 逻辑或、该运算符类似于or但优先级更低 |

### 八. 赋值操作符

| 操作符 | 优先级 | 结合 | 说明 |
| --- | --- | --- | --- |
| `=` <br>`+=` <br>`-=` <br>`*=` <br>`/=` <br> `&=` `^=` <br>&#x7c;= <br>`<<=` <br>`>>=` | 最低优先级 | 由右向左 | aardio中赋值操作符不能用于表达式并返回值,只能用于独立的赋值语句 |

> 除了`**`和`++`外所有的二元运算符都是左连接的.

### 九. 其他特殊操作符

- `..` 加在其他标识符前用于访问全局对象，例如 `..string` 等价于 `global.string`。 `..` 不能叠加， **`..` 后面不能出现空格** ，不能用于除标识符以外的表达式。参考：[命名空间](../namespace.html)
- `::` 用于创建或访问保留常量。`::` 后面不能有空白，必须紧接标识符，并且保留常量的第一个字符不能是小写字母，也不能是下划线。典型的保留常量有 `::User32`,`::Kernel32` 等对象。 参考：[保留常量](../variables-and-constants.html)
- `$`  编译时操作符，后面必须用一个双引号或反引号包含的原样字符串( raw string) 指定要包含的文件路径。aardio 在编译时会将指定的文件编译为字符串（ 可包含二进制数据 ）。 参考：[包含操作符](include.html)
- `@`  可用在表或数组构造器内定义元表，例如 `var tab = { k = v; @{ _type="object"} }` 。在其他位置置于其他对象之后可以访问对象的元表，例如 `time()@` 可访问时间对象的元表。请参考：[元表](../datatype/table/_.html)