中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --
联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟
中国DOS联盟论坛
现在时间是 2026-08-14 03:56
47,811 主题排行 / 349,897 发帖 / 今日 0 篇 / 48,256 会员排行
DOS批处理 & 脚本技术(批处理室) » [小把戏]交换两个变量的值而不使用临时变量
可打印版本  8,506 / 20
第1楼 namejm 发表于 2007-01-25 08:16
荣誉版主 发帖 1,737 积分 5,226 来自 成都
[小把戏]交换两个变量的值而不使用临时变量
  通用型的:

  如果要交换的两个变量的值是数字的话,还可以使用如下两种方案:

  方案一:

  方案二:
第2楼 PPdos 发表于 2007-01-25 08:27
高级用户 发帖 268 积分 783
被我先抢座了^^
纪录在案 以备后用!~
第3楼 hangyug 发表于 2007-01-25 08:29
初级用户 发帖 43 积分 99
呵呵,试了一下,真是,,,还在琢磨呢。。。
第4楼 0401 发表于 2007-01-25 09:02
中级用户 发帖 88 积分 435
不错,巧妙利用环境变量扩充的特性。其实这三个例子应该都算是一个意思吧。
第5楼 namejm 发表于 2007-01-25 10:11
荣誉版主 发帖 1,737 积分 5,226 来自 成都
Originally posted by 0401 at 2007-1-24 20:02:
不错,巧妙利用环境变量扩充的特性。其实这三个例子应该都算是一个意思吧。

  如果你仔细看了代码的话,你就会觉得它们并不是同一种思路:通用型的代码利用了 & 来交换两个变量的值,方案一利用了 set /a 的一些特性,方案二在利用 set /a 的特性的基础上,还使用了A+B-A=B、A+B-B=A这个算式来交换变量的值。

  其实,这几段演示代码还引出了一个比较有趣的话题:set var1=%var2%已经把var2的值赋给var1了,按理说,此时var1的值已经发生了改变,但是,在使用 & 引出另一个赋值语句 set var2=%var1% 的时候,为什么var2还能得到var1发生改变前的值?难道var1这个变量能同时保存一个以上的值吗?set /a num1=num2%,num2=%num1%也存在类似的现象。
第6楼 pengfei 发表于 2007-01-25 10:25
银牌会员 发帖 485 积分 1,218 来自 湖南.娄底


namejm兄给出的三种方法中, 第一种利用管道符交换变量,后两种是差不多的意思, 用逗号运算符来交换变量.

其实这种方法是利用脚本的特殊性实现的, 如果大家熟悉C语言中宏的话就不难理解了. 脚本靠解释器执行, 批处理脚本解释器在解释时必须先执行宏展开, 并且在一般情况下为一行一行解释.



其实真正不用中间变量交换两个变量值, 在二进制程序中也可以实现的方法也有.

就是用位运算来实现的, 呵呵~ 大家想想?
第7楼 qzwqzw 发表于 2007-01-25 10:41
银牌会员 发帖 636 积分 2,343
C语言教材的教学案例



另外,四则运算也可以实现

只是没有异或运算灵活无限制

第8楼 pengfei 发表于 2007-01-25 10:46
银牌会员 发帖 485 积分 1,218 来自 湖南.娄底
是的, 四则运算无论从效率还是使用范围来说都没有位运算那么好.

第9楼 0401 发表于 2007-01-25 10:59
中级用户 发帖 88 积分 435
在单个语句之中,变量的赋值并不能马上被扩展(引用),只能在下一个语句中才能被扩展。单个语句是指 if for 语句以及使用括号 && & ||等连接的语句。除非启用了环境变量扩展延迟,并且使用“!”来代替“%”才能扩展变量值。所以我才说namejm兄你的三个例子意思差不多。。。
第10楼 simazhuo 发表于 2007-01-25 11:07
新手上路 发帖 2 积分 1
不错,收藏了
第11楼 namejm 发表于 2007-01-25 11:17
荣誉版主 发帖 1,737 积分 5,226 来自 成都
Originally posted by pengfei at 2007-1-24 21:25:脚本靠解释器执行, 批处理脚本解释器在解释时必须先执行宏展开, 并且在一般情况下为一行一行解释.

  呵呵,想起了这就是批处理的预处理机制^_^,准确的说法似乎应是 逐句执行。
第12楼 pengfei 发表于 2007-01-25 11:20
银牌会员 发帖 485 积分 1,218 来自 湖南.娄底
是的, 一般情况下为一行一行解释, 应该改为逐句解释执行, 用括号括起来的复合语句, 解释器也是一次执行的.
第13楼 lxmxn 发表于 2007-01-25 13:49
版主 发帖 4,938 积分 11,386

  感觉还是9楼的 0401 说得比较在理,如果启用变量延迟,以上的某些示例可能不成立。
第14楼 pengfei 发表于 2007-01-26 12:03
银牌会员 发帖 485 积分 1,218 来自 湖南.娄底
lxmxn兄用call %%var1%%实际没有展开, 和!var!一样, 是变量延迟的另一种用法. 因此变量交换也无法实现.
第15楼 htysm 发表于 2007-01-27 05:33
高级用户 发帖 415 积分 866
精彩。精彩。
1 2  下一页
[ 联系联盟系统管理团队 - 中国DOS联盟 - 标准版 ]
Sponsored by ifanr Inc | © 2001–2023