Skip to content

Latest commit

 

History

History
369 lines (274 loc) · 10.3 KB

File metadata and controls

369 lines (274 loc) · 10.3 KB

目录

表达式

概述

表达式是一串求值结果为已支持数据类型之一的单行代码。
这串单行代码可以包含上面已经提到的所有运算。
例如,它可以用于数学计算、逻辑判断,或者字符串拼接等。

执行整个表达式并得到结果,被称为对表达式进行求值
如果表达式被用于逻辑运算,则最终的求值结果应该是布尔值;
如果表达式被用于常规数学运算,则最终的求值结果应该是数字;
如果表达式被用于字符串操作,则最终的求值结果应该是字符串。

下面列出的例子有助于帮助你的理解。

示例一

该表达式将计算 1+1 的结果,很显然是 2
因此该表达式的求值结果为 2

1+1

示例二

该表达式将判断 1+1 是否为 2。
很显然这是成立的,所以求值结果是 True

1+1==2

示例三

该表达式将判断 1+1=2 并且 2+2=4 是否同时成立。
很显然这是成立的,所以求值结果是 True

1+1==2 and 2+2==4

示例四

该表达式将判断 1+1=2 并且 2+2=4 是否同时成立。
很显然这是成立的,所以求值结果是 True

1+1==2 and 2+2==4

示例五

该表达式将判断 1+1=2 并且 2+2=4 并且 9+9==0 是否同时成立。
很显然 9+9 为 18 而不是 0,所以求值结果是 False

1+1==2 and 2+2==4 and 9+9==0 

示例六

由于与运算(and)的优先级比或运算(or)的更高,
因此它将先判断 2+2=4 并且 9+9=0 是否成立。
很显然这是不成立的,所以 2+2==4 and 9+9==0 为假。

然后,表达式化为了 1+1==0 or False
进而化为 False or False,因为 1+1 不为 0。

所以,整个表达式的求值结果是假,也就是 False

1+1==0 or 2+2==4 and 9+9==0 

示例七

它将首先检查 1+1=2 是否正确。
很显然这是正确的,所以表达式化为 True or 0/0==0

你可以观察到还有一个是 0/0==0 即检查 0 除以 0 是否为 0,很显然这是不正确的运算。
但由于或运算中已经存在一个为真了,所以整个或运算为真。

因此对该表达式的求值结果是 True

1+1==2 or 0/0==0

具体来说,在执行表达式时,系统实际是按顺序进行逻辑运算。
如果在某次运算时,出现了一个真值,则或运算的结果是真,而无论剩余的部分是否正确;
如果出现的是一个假值,则与运算的结果是假,而无论剩余的部分是否正确。

类似的例子是与运算的,它的求值结果是 False

1+1==0 and 0/0==0

示例八

该表达式将检查 2 是否不等于 4 并且 6 是否不等于 6。
很显然 2 确实不等于 4 但 6 等于 6 而非不等于,
因此该表达式化为 True and False,因而求值结果为 False

2!=4 and 6!=6

示例九

该表达式将检查 's' 是否在 'ss' 中。
很显然这是存在的,因此该表达式的求值结果为 True

's' in 'ss'

示例十

该表达式将对布尔值 True 的值取反,并将取反结果作为该表达式的求值结果。
True 取反将得到 False,因此该表达式的求值结果为 False

not True

同理,对 False 取反将得到 True
因此,下面这个表达式的求值结果为 True

not False

示例十一

该表达式指的是 8 乘以 7 再除以 56 再乘以 24 的结果。
很显然,该结果为 24,因此该表达式的求值结果为 24

8*7/56*24

示例十二

该表达式将获取玩家 @p[r=10] 在记分板 abc 上的分数。

{score, '@p[r=10]', 'abc'}

示例十三

该表达式将 @e[r=3] 的解析为实体名,并将字符串 '三格以内的实体有:' 和它拼接起来。

'三格以内的实体有:' + {selector, '@e[r=3]'}

如果 @e[r=3] 被解析为 Steve, Alex, 牛, NPC,则该表达式的执行结果如下。

三格以内的实体有Steve, Alex, , NPC

示例十四

该表达式将先计算 20 加上玩家 @p[tag=ABC] 在记分板 coin 上的分数。
然后,再将这个相加的结果减去 100。

20 + {score, '@p[tag=ABC]', 'coin'} - 100

这意味着如果这个分数为 80,则该表达式的求值结果为 0

示例十五

    1+1<7   and 6*6>=36 or  not 10!=10  and 4/20>=0 or  'abcd'  in  'aabcdd' and    100>1000
=>  2<7     and 36>=36  or  not False   and 0.2>=0  or  True                 and    False
=>  True    and True    or  True        and True    or  True                 and    False
=>  True                or  True                    or  False
=>  True

括号

概述

括号可以改变表达式的运算顺序。
下面给出的一些例子可以帮助理解。

示例一

    1+(10*3)
=>  1+30
=>  31

示例二

    4*6/12==2   or  (8*8==60    and 0*0==0)
=>  24/12==2    or  (64==60     and 0*0==0)
=>  2==2        or  (False      and True)
=>  True        or  (False)
=>  True

示例三

    ((9+9>1000  and 7/7==1) and (not    'gbk'   in  'ggbbkk'))  or  (4+4>=8 or  4*7<=1000)
=>  ((18>1000   and 1==1)   and (not    False))                 or  (8>=8   or  28<=1000)
=>  ((False     and True)   and (True))                         or  (True   or  True)
=>  ((False)                and True)                           or  (True)
=>  (False                  and True)                           or  True
=>  (False)                                                     or  True
=>  False                                                       or  True
=>  True

强制类型转换

概述

您可以通过强制类型转换将某个数据从一种数据类型转换到另外一种数据类型。
下面介绍了目前已被允许的强制类型转换语法。

强制转换为整数。

int(...)

强制转换为布尔值。

bool(...)

强制转换为浮点数。

float(...)

强制转换为字符串。

str(...)

另外下面四种写法与上面四种写法的作用是相同的。
出于简便的目的,您应该优先使用上面的写法。

写法1 写法2
int(...) {func, int(...)}
bool(...) {func, bool(...)}
float(...) {func, float(...)}
str(...) {func, str(...)}

示例

语句 执行结果 备注
int(10) 10 -
int(True) 1 -
int(False) 0 -
int(5.20) 5 -
int(5.99) 5 -
int('7') 7 -
int('5.99') 报错 '5.99' 是小数,不能转换为整数
int('a') 报错 'a' 不是一个数,不能转换为整数
语句 执行结果 备注
bool(False) False -
bool(True) True -
bool(0) False -
bool(+0) False -
bool(-0) False -
bool(1) True -
bool(2) True -
bool(-1) True -
bool(0.0) False -
bool(+0.0) False -
bool(-0.0) False -
bool(1.0) True -
bool(0.2) True -
bool('False') True -
bool('True') True -
bool('') True -
bool('ak5') True -
语句 执行结果 备注
float(10) 10.0 -
float(0) 0.0 -
float(False) 0.0 -
float(True) 1.0 -
float(5.7) 5.7 -
float(5.7) 5.0 -
float('3') 3.0 -
float('3.0') 3.0 -
float('3.01') 3.01 -
float('ak5') 报错 'ak5' 不是一个数,不能转换为浮点数
语句 执行结果 备注
str(10) '10' -
str(23) '23' -
str(-5) '-5' -
str(False) 'False' -
str(True) 'True' -
str(1.0) '1.0' -
str(-2.3) '-2.3' -
str('') '' -
str('ak5') 'ak5' -

注意事项

所有不等于 0 的值在被转换为布尔值时,都会得到 True
这意味着当且仅当值等于 0 时,才会得到 False

语句 执行结果 备注
bool(0) False -
bool(+0) False -
bool(-0) False -
bool(0.0) False -
bool(+0.0) False -
bool(-0.0) False -