-
Notifications
You must be signed in to change notification settings - Fork 1
/
switch.mdtlbl
53 lines (52 loc) · 1.4 KB
/
switch.mdtlbl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#**
* 一种在常量时间内直接跳转至第不小于零的整数代码段的分支选择方式
*
* case后面接的是id, 表明了第几段代码, 可以写多个
* 如果不写的话, 则为上一段代码的id+1, 没有上一段代码的话则为0
*
* 这个switch会展开成select, 具体可以用编译模式A来观察,
* 需要注意的是, 同时case多个值会直接将代码复制一份,
* 用的多的话考虑新版本的gswitch
*#
i = 4;
switch i {
case 1 2:
print "1 or 2\n";
print "foo";
break;
case: # 省略
print "3\n";
break;
case 5:
print "5\n";
case 4:
print "4\n";
print "穿透到5\n";
}
printflush message1;
#* 以上代码会生成如下结构:
set i 4
op add @counter @counter i
jump 8 always 0 0
jump 8 always 0 0
jump 11 always 0 0
jump 14 always 0 0
jump 16 always 0 0
jump 18 always 0 0
print "1 or 2\n"
print "foo"
jump 19 always 0 0
print "1 or 2\n"
print "foo"
jump 19 always 0 0
print "3\n"
jump 19 always 0 0
print "4\n"
print "穿透到5\n"
print "5\n"
printflush message1
*#
# 可以看到, 我们在case尾部不跳出, 我们就会进入到下一个case.
# 而匹配只有头部的一次, 所以会造成这种穿透.
# 这种穿透有好有坏, 但是请注意: 无论你case怎样写, 总是向下一个更大的case穿透
# 看起来case 5在case 4上方, 但其实case 5会被编译到case 4下方.