交换函数的陷阱——VB2005

本文探讨了编程中常用的交换函数,并深入分析了一个容易忽视的陷阱:使用XOR运算进行变量交换时,若两变量引用相同地址可能导致意外的结果。文章通过具体示例展示了如何避免此问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

        Public Shared Sub SwapNumber(ByRef N1 As Integer, ByRef 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 Integer, ByRef N2 As Integer)

            N1 = N1 Xor N2

            N2 = N1 Xor N2

            N1 = N1 Xor N2

        End Sub

测试一下这个函数

N=6

M=7

SwapNumber(N,M)

嗯,结果满意。NM的值的确交换了。

 

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

 

用下面的测试

N=6

SwapNumber(N,N)

 

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

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

 

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

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

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

            If N1 = N2 Then Exit Sub

            N1 = N1 Xor N2

            N2 = N1 Xor N2

            N1 = N1 Xor N2

        End Sub

 

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值