表达式与运算符

表达式是由一些值和运算符组成的式子,例如 10 + 2 这种。

GDScript 中表达式分为这么几类:

  • 算数表达式
  • 关系表达式
  • 逻辑表达式
  • 赋值表达式

算术表达式

顾名思义,算术表达式就是指数学运算的式子,例如 5 + 2 100 * 0.5 等,运算符有这些:

  • +
  • -
  • *
  • /
  • % 求余(取模)

最后一个取余数可能有点忘了是什么,其实就是小学二年级还没学小数的时候,“两个数除不尽”剩下的那个数,例如:

print(10 % 3) # 显示 1,因为 10 / 3 商 3 余 1
print(15 % 5) # 显示 0,因为 15 / 5 商 3 余 0,正好除尽

同时不要忘记先算乘除后算加减,必要时使用括号改变运算顺序:

((10 + 4) * 2 - 8) * 2

不要轻视这个小学知识点,在修改代码时可能会忘记前后的符号导致运算优先级出错,这种 bug 找起来十分麻烦。

[!tip] % 的优先级

是先求余还是先加减乘除?哈哈,我不告诉你。

当你的式子很长时,建议用一个临时变量保存一下中间结果,保证编程思路的清晰比什么都重要。

如果真的要在式子里混合求余运算符呢?那就加括号呗。

我写了七八年代码也没记住 % 的优先级,毕竟没有必要记住

[!note] 负数

直接在数字或变量前加一个减号即可表示负数,例如 print(-10),或是先 var a = 1print(-a) 即可显示 -1

[!note] 字符串拼接

加号 + 的两侧若为字符串,还表示字符串拼接,例如 var a = "a" + "b",那么 a 里面就会存放 ab 这两个字符。

关系表达式

关系表达式的运算符如下:

  • > 大于
  • < 小于
  • >= 大于等于
  • <= 小于等于
  • == 等于
  • != 不等于

这些应该也没什么好讲的,那么看一句代码:

print(10 > 9)

嗯,很简单,可是......它会显示什么呢?

这时要了解关系表达式的一个特点:它的结果是布尔值,也就是 true 或 false。

因为 10 > 9 这是个正确的不等式,所以结果是 true,假如有一句 print(10 == 9),那么这就会显示 false 了。

逻辑表达式

逻辑表达式的运算符有这些:

  • not 非(否)
  • and 与(同时为 true)
  • or 或(任意为 true)

乍一看比较蒙,根据括号里的词语理解一下,这三个运算符是对布尔值进行计算的。

第一个 not 是一个一元运算符,它只对一个数据进行操作,写在被操作数的前面,例如 not false 就表示 true

and 运算符只有在两侧都为 true 时结果才是 true,否则结果一律为 false

orand 相反,两侧都为 false 结果才是 false,否则结果为 true。或者理解成只要有一个 true,结果就是 true

赋值运算符

我们一直看到的等于号 = 其实就是一个赋值运算符,它的作用就是把右边的值放到左边的变量中。

其他的常用赋值运算符还有 += -= *= /=,他们分别表示根据变量中原有的值进行相对运算并保存到变量中,例如:

var a = 10
a += 10  # a 在原来的基础上又加了10,变成了20
a *= 2   # 由于上一句代码,a已经是20了,再乘上2,就变成了40
a /= 10  # 40 / 10 得到 4,a变成了4
print(a) # 显示 4

多种运算符混合计算

我们貌似已经发现了规律:

  • 数学运算符的参数是数字,结果是数字
  • 关系运算符的参数是数字,结果是布尔值
  • 逻辑运算符的参数是布尔值,结果是布尔值

所以,当上述多种运算符组合在一起时,会先运算数学运算符,接着是关系运算符,然后运行逻辑运算符,当然最后是赋值运算符。

[!tip] 等于和不等于

==!= 两侧的值不一定是数字,例如 "Abc" == "Abc" 的结果是 true"123" == 123 的结果是 false

综合例子

现在来测一测自己,下面这段代码的每个 print 会显示什么?

print(5 - 3 < 10)
var a = 100
print(a >= 100 and false)
a -= 99
a *= 10
print(a + 10)

答案在下面

.

.

.

.

.

.

.

.

.

.

.

.

true

false

20