![]() |
中国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 |