在对数据进行处理的时候,我们经常需要根据不同的情况,调用不同的命令,这就是编程中非常重要的一环:逻辑。
在果壳精灵中,实现逻辑处理主要有两种写法:if、select case。
对于编程来说,很多语句的写法格式是固定不变的,这些规则只能依赖死记硬背背下来,然后用熟练,编程要接触的单词可比小学英语简单多了,相信难不倒你。
If语句有以下几种写法:
// 单行逻辑判断并执行 If 逻辑表达式 Then 要执行的语句 // 多行逻辑判断并执行 If 逻辑表达式 Then 要执行的语句 ElseIf 其他逻辑表达式 Then 要执行的语句 Else 所有逻辑都不成立时要执行的语句 End If
第一种写法是只要条件达成,就执行某个指令或计算时使用,例如,当 1 + 1 = 2 的时候,我们就弹出来一个消息对话框:
If 1 + 1 = 2 Then MsgBox("1 + 1 = 2 正确")
我们还可以进一步扩展我们的逻辑,例如在代码不正确的情况下,也有反映:
If 1 + 1 <> 2 Then MsgBox("1 + 1 = 2 不正确")
两个代码合并在一起,我们就能够判断,1 + 1 到底是不是等于 2 了,当然,多数情况下我们的代码不会这么写,因为两个条件分散写死了,不方便修改。
在上一篇教程中我们学会了定义变量,因此我们可以定义一个逻辑类型的变量,来存储 1 + 1 = 2 的结果,形成我们最终版本的代码:
Dim 是否 As Boolean = (1 + 1 = 2) If 是否 Then MsgBox("1 + 1 = 2 正确") If 是否 = false Then MsgBox("1 + 1 = 2 不正确")
这种写法对于编程初学者来说很好理解,就好像一整行代码是一个命令调用一样,只不过我们为这个命令调用加上了限定的条件。
代码仍旧是线性运行的,先第一行,然后第二行,然后第三行…… 不会出现执行顺序错乱的问题。
但是如果我们处理的逻辑之后,需要执行一大段代码,问题就比较麻烦了,按照这个方法,我们可能要写类似这样的代码:
Dim 是否 As Boolean = (1 + 1 = 2) If 是否 Then TracePrint("1") If 是否 Then TracePrint("+") If 是否 Then TracePrint("1") If 是否 Then TracePrint("=") If 是否 Then TracePrint("2") If 是否 Then TracePrint("正") If 是否 Then TracePrint("确") If 是否 = false Then TracePrint("1") If 是否 = false Then TracePrint("+") If 是否 = false Then TracePrint("1") If 是否 = false Then TracePrint("=") If 是否 = false Then TracePrint("2") If 是否 = false Then TracePrint("不") If 是否 = false Then TracePrint("正") If 是否 = false Then TracePrint("确")
这会显得代码很拖沓,而且因为重复判断了变量【是否】的值,也会导致脚本性能的降低,为了解决这个问题,我们需要学习第二种 If 语句:
Dim 是否 As Boolean = (1 + 1 = 2) If 是否 Then TracePrint("1") TracePrint("+") TracePrint("1") TracePrint("=") TracePrint("2") TracePrint("正") TracePrint("确") Else TracePrint("1") TracePrint("+") TracePrint("1") TracePrint("=") TracePrint("2") TracePrint("不") TracePrint("正") TracePrint("确") End If
这种写法为代码增加了【结构】,是一种结构化语句,所谓结构,就是将代码分割成明显的区块。
区块内部仍是顺序执行的,但区块本身可能会执行,也可能不执行。
例如这段代码,If 和 Then 两个单词之间的代码就是逻辑判断代码,当这个逻辑判断成立时,它就会执行 Then 到 Else 之间的代码块。
而当 If 到 Then 之间的逻辑判断不成立时,它就会执行 Else 到 End If 之间的代码块。
If 语句写法比较灵活,例如你可以再增加一些条件判断:
If 1 + 1 = 2 Then MsgBox("1 + 1 = 2") ElseIf 1 + 1 = 3 Then MsgBox("1 + 1 = 3") ElseIf 1 + 1 = 4 Then MsgBox("1 + 1 = 4") Else MsgBox("我也不知道 1 + 1 等于几") End If
我们在 If 到 Else 之间,添加了两个 ElseIf,这种语句的写法和【If 判断 Then】类似,只不过 If 变成了 ElseIf,ElseIf 可以添加任意个,也可以不添加。
同样的,我们还可以在任何情况下,省略掉 Else 语句块:
Dim 是否 As Boolean = (1 + 1 = 2) If 是否 Then TracePrint("1") TracePrint("+") TracePrint("1") TracePrint("=") TracePrint("2") TracePrint("正") TracePrint("确") End If
这样 If 语句就相当于只判断一个条件了,执行一个代码块了。
注意,If 语句只会执行一个代码块,不管执行了哪个代码块,当代码块执行完毕后,都会跳转到 End If 语句的下一行继续执行。
而不是继续执行其他代码块的代码,这很重要,它并没有破坏代码一定是线性执行的基本准则,只是在线性的基础上,增加了跳转执行的能力,如图所示:
我们可以利用已经学习到的命令配合 If 语句,实现一些基本的功能了,例如摇骰子猜数字游戏:
// 生成一个 1 - 6 的随机数 Randomize Dim 骰子号 As Long = Rnd(1, 6) // 让用户输入一个数字 Dim 输入数 As String = InputBox("猜猜我摇出来了几?", "1") // 检查猜测结果是否正确 If CLng(输入数) = 骰子号 Then MsgBox("恭喜你猜对了!") Else MsgBox("很抱歉,你猜错了哟~") End If
这里我们使用了一些新的命令:
Randomize 命令用于初始化随机数生成器,确保不会每次都生成相同的随机数。
Rnd 命令可以生成指定范围的随机数,我们指定的范围是 1 - 6,这个命令还有其他用法,感兴趣的朋友可以看一下命令的集成帮助。
CLng 命令用于将 InputBox 输入的字符串转换为数字,文字和数字是不可以直接进行对比的,因此需要转换数据类型才行。
这一段代码如果你已经能够无障碍的理解了,说明 If 语句你已经初步学会使用啦,接下来,就是不断的实战,提升熟练度吧!
有 If 语句打底,相信大家理解 Select 语句会容易的多,这里直接上一段代码:
Select Case (1 + 1) Case 1 MsgBox("1 + 1 = 1") Case 2 MsgBox("1 + 1 = 2") Case 3 MsgBox("1 + 1 = 3") Case 4 MsgBox("1 + 1 = 4") Case Else MsgBox("1 + 1 = 其他值,我也不知道到底是啥") End Select
对于编程来说,语句的写法往往是固定的,Select 语句总是以 Select Case 开头,然后写上要判断的数据。
之后可以写一个或者若干个 Case 语句,每个 Case 后面都可以跟着数据的猜测结果,或者 Else,但 Else 语句只能有一个,在最后面。
最后,我们在末尾补上一个 End Select 语句,它的执行过程是这样的:
必须牢记:代码总是线性执行的!
这句话让你在分析问题的时候,能够很好的总结前因后果,之前进行了什么操作,修改了什么数据,导致之后的代码执行的时候出现了什么问题。
这一切都必定会有一条线牵着,这条线就是代码执行的顺序,先执行的哪一行,后执行的哪一行,连起来就是一整个程序。
大多数情况下,我们都可以用 If 语句来代替 Select Case 语句,在刚学习编程的时候,还记不住那么多单词的时候,少记一些语句就少些焦虑。
等 If 语句用熟练了,再回过头来学习 Select Case 语句也是没什么问题的。
既然 If 可以完全替代 Select Case 语句,那么 Select Case 语句存在的意义是什么呢?
因为 Select Case 语句对值的判断方式更丰富,做教学必然是不会藏私的,这里也把 Select Case 语句内的 Case 判断方式补充一下:
// 这是最简单的单个值判断: Select Case 表达式 Case 值 End Select // 这样可以多个值判断,有一个值相同条件就成立: Select Case 表达式 Case 值1, 值2 …… End Select // 这样可以判断一个数字范围: Select Case 表达式 Case 最小值 To 最大值 End Select // 也可以使用这些运算符参与判断(>、<、>=、<=、=、<>): Select Case 表达式 Case > 值 End Select
怎么样?在特定场景下,Select 语句确实是比 If 语句好用一些的吧?