交换函数的陷阱——VB2005

一站式解决Windows软件依赖:Microsoft Runtimes AIO原理与应用全解析 动态链接库(DLL)是Windows系统中软件运行的基础组件,它们通过共享代码库机制实现功能复用,减少应用程序体积。其工作原理在于程序运行时从系统目录加载所需的DLL文件,当这些文件缺失或版本不匹配时,就会出现经典的“DLL地狱”问题。这项技术的核心价值在于保障软件兼容性,特别是对于使用Visual C++开发的应用程序,必须安装对应版本的Visual C++ Redistributable运行时库。在实际应用场景中,系统管理员、软件测试人员和游戏玩家经常需要处理多个不同版本的运行时依赖,手动安装效率低下且 阅读详情

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

        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)

嗯,结果满意。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 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

 

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

【信息科学与工程学】【产品体系】第二十六篇 存储系统及存储服务器中所有学科知识01 存储系统是一门交叉学科,涉及计算机体系结构、分布式系统、编码理论、操作系统、网络等多个领域。编号类型学科/课程/产品存储系统领域的作用(含 AI infra / 存储网络 / 存储服务器 / 存储领域)核心知识点及数学建模/方程式/算法在存储系统中的作用及详细设计方法、时序、流程、模式代表教材/资料/论文 + 链接工业界应用001基础理论计算机体系结构、操作系统决定存储层级(寄存器-L1/L2/L3-内存-SSD-HDD-磁带),是 AI 训练集群、存储服务器、SAN/NAS 的物理底座存储层级模型:访问延 阅读详情

相关推荐

路径规划:D*Lite寻路算法详解

D*Lite详解目录

mkr67n的博客 2万+

C/C++中关于交换(Swap)函数的三种方法

在学习编程中,交换函数是我们一定要理解的例子,以下是我的一些理解,希望可以帮助到大家。一、交换函数的说明在main函数中创建两个值,通过调用函数对其进行交换。分享一下我对这三种方法的理解,希望对大家有所帮助。

m0_74058637的博客 6万+

软考中级信息系统监理师(第二版)-第21章基础设施工程监理

由于网络信息技术的飞速发展,变化日新月异,网络设计不但要保证目前网络传输容量的要求,也要考虑今后网络的发展,满足当前以及今后相当一段时间内的网络需求,便于向新技术的升级和衔接,同时又需要保护原有的投资。通用布缆系统工程中,承建单位的竣工文档主要包括以下内容:承建合同,招标文件,投标文件,设计方案,工程实施组织设计方案,工程施工报告,隐蔽工程记录,变更记录,自测报告,信息点分布图(表),园区、楼宇、水平配线表,楼层平面图及无线设备点位图,无线设备信息表,竣工图纸等。多排安装时,列间距不应小于1200mm。

2301_78583973的博客 1400

Swap(交换函数)

交换两个变量的值 定义一个中间变量tmp,可实现交换 int main() { int a = 10; int b = 20; printf("%d,%d\n", a, b); int tmp=a; a=b; b=tmp; printf("%d,%d\n",a,b); return 0; } 现将用Swap函数来实现交换 错误形式1: ​void Swap(int a, int b) //error c传值,形参的改变不会影响实参 { int tmp

weixin_59179454的博客 2万+

abaqus 6.13安装(ubuntu 16.04LTS)

1。从iso将文件拷贝出来 2。chmod 777 -R ./* 给文件权限 3。sudo /home/xx/A/setup 4。安装licenseserver 5。拷贝lic,log文件 6。打开license sudo ./lmgrd -c path 7. 27011@xx or 27011@localhost ...

a1099313374的博客 1950

信号完整性仿真SI之Cadence Sigrity SPEED2000_眼图仿真(四)

今天给大家分享一个仿真的操作流程,是关于Cadence Sigrity SPEED2000的时域波形仿真和眼图仿真。我们会经常看见硬件工程师调试示波器上的一些信号的波形变化,其实这些也可以通过仿真电路的搭建来做出投板前的仿真,来优化走线,以减少版本的迭代次数。如果要和实际的信号保持一致,就要求仿真设置的参数和实际的参数保持一致,这也是仿真的重点和难点。下面先让我们了解一下Cadence Sigrity SPEED2000时域仿真的操作流程: 1.仿真模式选择与文件导入 选择Cadence Sigrity下的

刘小同学的博客 1万+

c语言 交换函数

交换a与b,需要借助c。

清濑灰二 2895

FSL软件安装

FSL软件安装

huang_tianyuan的博客 2631

VB中数字的交换

1.首先,在左侧工具栏中找到command button的图标,并在适当位置处创建。 2.在属性窗口中找到capition并在他的后面将名字改为“交换”。 3.在窗体中双击“交换”,并在弹出的对话框中输入以下内容 Cls Dim b As Integer Dim c As Integer Dim d As Integer c = Int(Rnd() * 1000) b = Int(

cai18732646484的博客 2681

MavLink协议入门

MAVLink是一个非常轻量化的开源的消息协议,用于无人机之间的通信以及无人机机载设备之间的通信。

ffffffeiyu的博客 2475

FPS游戏自动枪械识别+压枪(以PUBG为例)

使用Python3.9作为开发环境,实现一个通用的FPS游戏自动检测枪械配件+压枪宏的软件开发思路

weixin_37827742的博客 3万+

swap()交换函数的用法

#include void swap1(int a ,int b)//这样交换实际上是把a和b两个形参的进行了交换,而主函数中的a b实参是没有变化的 {   int tmp;  tmp=a;  a=b;  b=tmp; } void swap2(int *a ,int *b)//这样交换实际上是把a和b两个形参的地址进行了交换,而主函数中的a b实参是没有变化的 {  int

u010575913的专栏 9819

【系统分析师】2025年上半年真题:案例分析-答案及详解(回忆版)

摘要: 试题一考查面向对象分析,涉及用例模型构建的四个阶段(识别参与者、合并需求、细化描述、调整模型),分析CRM系统的参与者与用例,并说明用例间的包含、扩展和泛化关系。 试题二探讨嵌入式Docker,包括容器的轻量性、可移植性及隔离性含义,10项措施与7个规范方面的对应关系,以及优化容器切换时间的三种方法(如无状态连接优化)。 试题三聚焦数据库设计,分析订单表的函数依赖与范式分解(BCNF),讨论分解后是否保持函数依赖及无损性,并针对触发器的性能缺陷提出优化方案。 试题四解析Web开发中的MVC架构与SS

数据知道的博客 6605

本人Blog的文章目录

本人Blog文章目录:“计算字符串的相似度”系列:计算字符串的相似度(VB2005)——思索之一计算字符串的相似度(VB2005)——思索之二计算字符串的相似度(VB2005)——思索之三计算字符串的相似度(VB2005)——思索之四本系列文章已经完结“2009年9月刊《程序员》算法题之我见”系列:2009年9月刊《程序员》算法题之我见——思索之一2009年9月

万仓一黍 1015

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

【练习吧】C++ 中的 swap() 函数实现交换

有时面试题里有陷阱,没错,数值交换没交换,话不多说,老样子,直接上代码丢图: –I #include<iostream> using namespace std; // 交换函数 void swap01(int a, int b){ // I不同点 int t = a; a = b; b = t; } int main(){ int a = 2...

shenli_MLZS 3941

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

交换函数

第一种:利用中间变量tmp直接交换a,b的值-------错误 #include void Swap(int a,int b)               {        int tmp;                                           tmp = a;        a = b;        b = tmp; } int main() ...

YOUNG_908的博客 3914

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

c语言自定义交换函数,C语言自定义交换函数(swap)的使用【转】

今天同学给了我一道题的代码,说他自己找了半天错误也没有AC那道题,让我给看看。拿到代码看了一下,发现一个很严重的误区,专门写出来说一下。全部代码我就不贴了,我只是就那个误区构造了一段错误的代码。#include void swap(int x,int y)//这是错误的写法{int temp;temp=x;x=y;y=temp;}int main(){int a=5,b=8;swap(a,b);p...

weixin_34460466的博客 4971

交换函数定义

#define SWAP(a,b) do{ typeof(a) _tmp = (a); (a) = (b); (b) = _tmp; }while(0);

xuxudeta的博客 1233

【4】交换函数swap的正确使用 及其 几种错误情况示范

1.正确使用 一个函数如果想要修改另一个函数的数据,那么必须需要传指针和解引用。以一个简单的程序示例如下:运行情况如下:2.那么在交换中,有什么需要我们注意的点呢?也就是说会有哪几种错误的示例呢?(1)第一种错误:没有使用传指针和解引用,数据并不会进行交换。(2)第二种错误:没有正确的使用传指针和解引用,造成的结果是数据并不会进行交换。(3)第三种错误:使用了传指针和解应用,但是使用不规范。   ...

Murphy5222的博客 4420

交换函数解释

为啥交换函数swap(int a,int b) 函数。不能交换传入的数 不能在函数体外有效 因为是编译器为 a b临时开辟空间 交换完了就无效了 这就是传值调用 而下面的是传址调用swap(inta,intb) { int tmp; tmp=*a; *a=tmp; *b=tmp; } 假如两个实参xy 传入swap(&x,&y) 则能互换 ...

doctorlyly的博客 528

三个交换函数解释

1.#include iostream.h>void swap(int *p1,int *p2)...{  int temp;  temp=*p1;  *p1=*p2;  *p2=temp;}void main()...{ int a,b; int *pointer1,*pointer2; cin>>a>>b; pointer1=&a; pointer2=&b; swap(pointer1

Jack Zhu的专栏 1445

C语言:交换函数

1、一般情况下认为交换函数如下程序 void Swap_1(int a,int b) { int tmp = int a; a = b; b = tmp; } 此时的程序其实是不正确的,因为此时交换的只是变量所赋的值,而所谓的交换函数交换的是变量的值和它的地址, 打个比方:小明有一个蓝色的文具盒,里面有一只蓝色的笔,小红有一个红色文具盒,里面有一只红色的笔,所谓的 交换函数就...

OYhuahua的博客 3075
上一篇: 本人Blog的文章目录
下一篇: 遍历排列的实现——VB2005
grenet
博客等级 码龄17年 28粉丝 26原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值