表达式与运算符
表达式是由一些值和运算符组成的式子,例如 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 = 1
再print(-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
or
与 and
相反,两侧都为 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