众所周知,无论程序多么复杂,总是逃脱不了三大基本结构的“束缚”——它们即我们熟知的“顺序”、“选择”与“循环”。自然,不同的编程语言也为这些结构设定了不同的语法与表达形式。它们虽然“大同小异”,但有些“小异”还是值得我们去推敲和关注的——比如VB.NET中逻辑运算符“And”的“短路”问题。
逻辑运算中的“短路”现象并不是我们日常生活中看到的电路的“短路”,它只是借用了电工学中三大电路状态(通路、断路、短路)中的一个专用名词而已;但如果硬要把它和“电学”联系起来也未尝不可——如果你是电子信息专业的学生,就应该学过数字电路——还记得么——数字电路中“时序逻辑短路”不是曾经有过“逻辑与(或、非、异或、同或)”的概念么?记得那个时候我们还学习过真值表,为此还编出“见零得零,全一为一(逻辑与)”的口诀——实际上,这句口诀还可以再浓缩一下——即“逻辑与”运算只要有一个表达式为0,则其余表达式可不必计算,直接写出“0”作为结果;同样地,“逻辑或”只要表达式中有一个为1,那么结果必然为1,这样“只要以某个表达式就可以计算出整体结果”的运算称为“短路运算”,这样的运算符称为“短路运算符”;计算机编程语言中的“选择”既然是逻辑表达式的天下,那么它们的表达式是否符合这个规律呢?下面让我们用VB来验证一下:
【试验一】请读者打开VS2005,创建一个新的模块文件,敲入下列代码:
Dim a() As Integer = {1}
If (a(0) = 0) And (a(1) = 0) Then
Console.WriteLine()
Else
Console.WriteLine("你执行了短路And运算,因而系统不会检测a(1)=0这个运行错误。")
End If
End Sub
在用鼠标点击Run前,是否你脑袋中认为“既然And是短路运算,那么‘a(1) = 0’这个明显的错误不会被系统运行时捕获”吧?然后请点击并验证您的猜想——我相信绝大多数人会大吃一惊的——因为系统报错了!
事实上原因很简单——因为VB中And并非像“数字电路”中、或者是C语言一类的(&&)那么“门槛精”地“短路运算”,它只会“按部就班、老实巴交”地按照一个个表达式进行布尔判断,最后才根据数字电路“逻辑与”口诀输出最终结果。所以“And”进行逻辑运算并不都是非常安全的——尤其是当某个逻辑表达式出错(如“除法溢出”或“下标溢出”等)。
要解决这个问题,同时提高运算效率,我们可以引入真正的“短路‘与’运算符”——Andalso”。下面请把上面运行时报错代码中的“And”改成“Andalso”,再点击鼠标运行,看看是不是OK了?代码如下:
【试验二】请读者打开刚才在VS2005中已经创建的模块文件,修改后的代码最终如下:
Dim a() As Integer = {1}
If (a(0) = 0) AndAlso (a(1) = 0) Then
Console.WriteLine()
Else
Console.WriteLine("你执行了短路And运算,因而系统不会检测a(1)=0这个运行错误。")
End If
End Sub
当然,Or也推荐改为“OrElse”。