# 运算符

无论如何，你肯定需要对变量进行运算，或者判断一些逻辑关系。这就是需要运算符来进行操作。

## 二元算术运算符

除了大家最熟悉的加减乘除（`+` `-` `*` `/`）之外，还有个 `%` 做取余操作（`10 % 3 = 1`）。

同时加号还用于字符串拼接。

## 一元算术运算符

一元算术运算符有自增（`++`） 和自减（`--`），它们可以把元素加 1 或减 1。

自增（减）运算符放在变量名前后是有区别的。放在前面为先自增（减）再运算，后面则是先运算再自增（减）

```javascript
var a as int = 1;
var b as int = 1;

println(5 * a++);
println(a);

println(5 * ++b);
println(b);
```

打印信息：

```
[17:27:31.267][DONE][CLIENT][INFO] 5
[17:27:31.267][DONE][CLIENT][INFO] 2
[17:27:31.267][DONE][CLIENT][INFO] 10
[17:27:31.267][DONE][CLIENT][INFO] 2
```

## 比较运算符

| 名称   | 作用                                     |
| ---- | -------------------------------------- |
| `==` | 检查两数的值 **是否相等**，如果是，则返回 `true`         |
| `!=` | 检查两数的值 **是否不等**，如果是，则返回 `true`         |
| `>`  | 检查左边的数是否 **大于** 右边的数，如果是，则返回 `true`    |
| `<`  | 检查左边的数是否 **小于** 右边的数，如果是，则返回 `true`    |
| `>=` | 检查左边的数是否 **大于或等于** 右边的数，如果是，则返回 `true` |
| `<=` | 检查左边的数是否 **小于或等于** 右边的数，如果是，则返回 `true` |

## 逻辑运算符

用于判断两个布尔值的逻辑关系

| 名称     | 作用                                                              |
| ------ | --------------------------------------------------------------- |
| `&&`   | 与，左右均为 `true` 才会返回 `true`，如果左边为 `false` 将直接返回 `false`，不进行右边的运算  |
| `\|\|` | 或，左右只要有一个 `true` 才会返回 `true`，如果左边为 `true` 将直接返回 `true`，不进行右边的运算 |
| `^`    | 异或，如果左右值不一样将会返回 `true`，反之为 `false`                              |
| `!`    | 非，将一个布尔值值反转，`true` 变 `false` ，`false` 变 `true`                  |

## 三元运算符

是一种特殊的语法：`flag ? a : b`

`flag` 是一个布尔值，如果是 `true`，将会返回 a，反之为 b。

## 位运算

ZenCode 同样支持 `&` `|` `~` `>>` `<<` 等位运算操作符，具体他们的作用可以百度。

## 赋值运算符

先运算并赋值。`a += 2;` 等价于 `a = a + 2;` 其他算术逻辑运算符同理。

## 当运算发生意外……

当数学运算结果发生意外时，很有可能是你使用不同类型的数字。 比如 `13 % 6.5` 结果为 1，可是正确结果应该是 0 啊，究竟发生了什么？ ZenScript 总是会对运算的两个数据类型进行处理，使其成为相同类型。在上述例子中，它就会将第二个数据转换，用以匹配第一个数据。 在上述例子中，计算就会处理成 `13 % 6`，第二个数字（双精度浮点值）就会被强制转换为第一个数字的类型（整型）。

此外 `3 + "ac"` 是会报错的，应为这会让 CrT 试图将右边的字符串转换成整数，而这是不合理的。你应该用 `"" + 3 + "ac"`，先把整数 3 转换成字符串才行。

要始终检查两个变量类型是否一致，你可以使用 `println` 函数来将结果打印至日志中来检查数据是否正确。
