众所周知,无论程序多么复杂,总是逃脱不了三大基本结构的束缚”——它们即我们熟知的顺序选择循环。自然,不同的编程语言也为这些结构设定了不同的语法与表达形式。它们虽然大同小异,但有些小异还是值得我们去推敲和关注的——比如VB.NET中逻辑运算符“And”的“短路”问题。
  
   逻辑运算中的“短路”现象并不是我们日常生活中看到的电路的“短路”,它只是借用了电工学中三大电路状态(通路、断路、短路)中的一个专用名词而已;但如果硬要把它和“电学”联系起来也未尝不可——如果你是电子信息专业的学生,就应该学过数字电路——还记得么——数字电路中“时序逻辑短路”不是曾经有过“逻辑与(或、非、异或、同或)”的概念么?记得那个时候我们还学习过真值表,为此还编出“见零得零,全一为一(逻辑与)”的口诀——实际上,这句口诀还可以再浓缩一下——即“逻辑与”运算只要有一个表达式为0,则其余表达式可不必计算,直接写出“0”作为结果;同样地,“逻辑或”只要表达式中有一个为1,那么结果必然为1这样“只要以某个表达式就可以计算出整体结果”的运算称为“短路运算”,这样的运算符称为“短路运算符”;计算机编程语言中的“选择”既然是逻辑表达式的天下,那么它们的表达式是否符合这个规律呢?下面让我们用VB来验证一下:

【试验一】请读者打开VS2005,创建一个新的模块文件,敲入下列代码:

Public Sub Main()
     
Dim a() As Integer = {1}
        
If (a(0= 0And (a(1= 0Then
            Console.WriteLine()
        
Else
            Console.WriteLine(
"你执行了短路And运算,因而系统不会检测a(1)=0这个运行错误。")
        
End If
End Sub

 

在用鼠标点击Run前,是否你脑袋中认为“既然And是短路运算,那么‘a(1) = 0’这个明显的错误不会被系统运行时捕获”吧?然后请点击并验证您的猜想——我相信绝大多数人会大吃一惊的——因为系统报错了!
    
事实上原因很简单——因为VBAnd并非像“数字电路”中、或者是C语言一类的(&&)那么“门槛精”地“短路运算”,它只会“按部就班、老实巴交”地按照一个个表达式进行布尔判断,最后才根据数字电路“逻辑与”口诀输出最终结果。所以“And”进行逻辑运算并不都是非常安全的——尤其是当某个逻辑表达式出错(如“除法溢出”或“下标溢出”等)。

要解决这个问题,同时提高运算效率,我们可以引入真正的“短路‘与’运算符”——Andalso”。下面请把上面运行时报错代码中的“And”改成“Andalso”,再点击鼠标运行,看看是不是OK了?代码如下:

【试验二】请读者打开刚才在VS2005中已经创建的模块文件,修改后的代码最终如下:

Public Sub Main()
     
Dim a() As Integer = {1}
        
If (a(0= 0AndAlso (a(1= 0Then
            Console.WriteLine()
        
Else
            Console.WriteLine(
"你执行了短路And运算,因而系统不会检测a(1)=0这个运行错误。")
        
End If
End Sub


   当然,Or也推荐改为“OrElse”。

posted on 2007-09-09 19:41  maledong  阅读(539)  评论(0编辑  收藏  举报