交换函数的陷阱——VB2005

简介:

在编程的一些算法中,交换函数虽然不起眼,但也是一个不可或缺的组成部分。少了它,很多算法就难以为继。交换函数定义就是交换两个变量的值。有一点编程基础的人都能很快速的写出代码来。

  Public Shared Sub SwapNumber(ByRef N1 As IntegerByRef N2 As Integer)

    Dim I As Integer

    I=N1

    N1=N2

    N2=I

  End Sub

  这一段代码只写了Integer型的函数,其它类型的类似。

 

  但是,这个函数效率不高,额外的利用一个中间变量I。

  有人,利用Xor运算的回复性,写了下面一段代码来

  Public Shared Sub SwapNumber(ByRef N1 As IntegerByRef N2 As Integer)

    N1 = N1 Xor N2

    N2 = N1 Xor N2

    N1 = N1 Xor N2

  End Sub

  测试一下这个函数

    N=6

    M=7

    SwapNumber(N,M)

  嗯,结果满意。N和M的值的确交换了。

 

  但是这个函数有一个陷阱,不注意的话,会产生一个严重的逻辑错误。

 

  用下面的测试

    N=6

    SwapNumber(N,N)

 

  从需要来看。N和N交换,N的值应该还是6

  可是实际的结果令人瞠目,N=0。为何?

 

  关键是ByRef这个关键字,他引用的是变量的地址。在调用SwapNumber(N,N)这个函数的时候,N1和N2都引用N这个变量。当N1或者N2值发生改变的时候,N1、N2、N这三个变量是一起变化的。那么在第一行的时候,N1 = N1 Xor N2。实际执行的是N1=6 Xor 6=0,同时,N2的值也发生了变化,N2=0,因为N1和N2指向同一个变量。那后面就很好的理解了。最后退出函数的时候,N就是N1就是N2等于0

  怎么解决?在代码中加一行,遇到值相等的时候,就直接退出函数。因为这个时候,换与不换是一样的。

        Public Shared Sub SwapNumber(ByRef N1 As IntegerByRef N2 As Integer)

            If N1 = N2 Then Exit Sub

            N1 = N1 Xor N2

            N2 = N1 Xor N2

            N1 = N1 Xor N2

        End Sub

 

  在很多的书本与网页上讲到本算法的时候,都不会提到这个“陷阱”,那是因为在不同的编程语言中,这个陷阱是不一定出现的。我们看了一个算法,用自己的所熟悉的语言去实现它的时候,一定要做全方位的测试,要找到各个方面的陷阱,不要生搬硬套,以免产生严重的逻辑错误。


  本文转自万仓一黍博客园博客,原文链接:http://www.cnblogs.com/grenet/archive/2009/12/15/1625059.html,如需转载请自行联系原作者

相关文章
|
3月前
|
C语言 C++
[c语言&&c++]手写你自己的swap交换函数
[c语言&&c++]手写你自己的swap交换函数
26 0
|
5月前
|
C语言
模拟实现一些库函数(1)(下)
模拟实现一些库函数(1)(下)
17 0
|
5月前
模拟实现一些库函数(1)(上)
模拟实现一些库函数(1)
13 0
|
8月前
|
存储 算法 C语言
用C语言编写交换数组数值的代码教程
使用C语言编程的一个常见需求是交换数组中两个元素的值。这个操作在很多算法和程序中都有应用,因此学会如何编写交换数组数值的代码是非常重要的。本教程将向大家介绍如何使用C语言实现这个功能。
110 0
C/C++语言交换两个变量的七种方法
C/C++语言交换两个变量的七种方法
363 0
C/C++语言交换两个变量的七种方法
|
编译器 C语言 C++
初始C语言——梦开始的地方
C语言是一门通用计算机编程语言,广泛应用于底层开发。作为长期位于各大编程语言排行榜前三的高级语言,C语言具有广泛性、简洁性、结构完善性等特有特点,作为B语言的改进版本,C语言也能直接通过内存地址进行内存操作,这是大多数高级语言所不具备的特点,而我们的C可以。因此C语言具有极为强大的功能和较为直接的底层逻辑,换句话说,只要把C学好了,就能掌握编程的核心技术,其他高级语言的学习如探囊取物。
99 0
初始C语言——梦开始的地方
|
存储 网络协议 C语言
【CSAPP】x86-64的机器代码和原始的C代码差别巨大,一些常在C语言中隐藏的处理器状态
【CSAPP】x86-64的机器代码和原始的C代码差别巨大,一些常在C语言中隐藏的处理器状态
56 0
VB编程:巧用常量定义数组-37
VB编程:巧用常量定义数组-37
193 0
VB编程:利用指针实现数组拆分-44
VB编程:利用指针实现数组拆分-44