标题: [数值计算] [分享]批处理set/a命令精简与提速技巧 [打印本页]
作者: plp626 时间: 2011-6-5 13:04 标题: [分享]批处理set/a命令精简与提速技巧
比如要完成如下操作:
(该操作选自某个有关程序进度条显示的计算)- set/a n=0
- set/a p=1
- set/a a=20000
- set/a b+=1
- set/a c=b*100/a
复制代码
我们通常都是这么做(这样写紧凑还稍微能提高点效率):- set/a n=0,p=1,a=20000,b+=1,c=b*100/a
复制代码
如果你追求效率与短小的极致:下面写法更紧凑,效率也有所提高- set/ac=(b+=p=1)*100/(a=2000)+(n=0)
复制代码
另外:set/a 是表达式计算(验证了下,发现和C语言的表达式值计算规则基本相同)
逗号表达式的值等于最右边表达式的值:- set/a m=(a=3,b+=a,c=5)
- ::则m的值等于c的值
复制代码
给a、b、c、d、m、n;6个变量赋值为0的实用精简代码:复制代码
ps:原来想当然以为成倍提速呢,测试了下提速仅是5~8%,只有当有很多表达式参与运算时,效率才有所提升。
作者: CrLf 时间: 2011-6-5 13:23
太美妙了!
这么诡异的规则,楼主是怎么发现的啊?
作者: 随风 时间: 2011-6-5 13:33
第一次看见这种用法,学习了
代码简洁了,但也更难读了,
我还是喜欢第二种用法。
作者: CrLf 时间: 2011-6-5 13:35
不过如果再复杂一点呢,假如
set/a n=0,p=1,【a=20000*2】,b+=1,c=b*100/a
该怎么改成那样呢?
作者: CrLf 时间: 2011-6-5 13:41
刚刚在某群里鸡冻了下,结果被一群无良的地球人围殴,不厚道啊不厚道
作者: plp626 时间: 2011-6-5 13:42
本帖最后由 plp626 于 2011-6-5 17:46 编辑
set/a n=0,p=1,【a=20000*2】,b+=1,c=b*100/a
方法就是凑,能省尽量省:- set/a c=(b+=p=1)*100/(a=20000*2)+(n=0)
复制代码
更新下,还是这样比较好:- set/a c=(b+=p=1)*100/(a=20000*2),n=0
复制代码
作者: CrLf 时间: 2011-6-5 13:48
明白了,thanks!
作者: powerbat 时间: 2011-6-5 13:50
“和C语言的表达式值计算规则基本相同”
不是基本相同,而是完全相同。(bat不支持运算符的除外,比如++、--)
没学过C语言的同学吃亏了。。。
作者: CrLf 时间: 2011-6-5 13:54
8# powerbat
汗,确实...
作者: plp626 时间: 2011-6-5 13:59
8# powerbat
严密一些嘛,毕竟我也没看过源代码,C的表达式概念不限于数值,概念比较广。
作者: mxxcgzxxx 时间: 2011-6-5 16:37
第一次知道原来可以这样写,太强大了,很黄很暴力,收藏了
作者: CrLf 时间: 2011-6-5 18:22
set本身的用时远大于一条算式的耗时(好像是二十几倍),所以虽说是只提高了百分之六,但其实是有大幅提高的,当算式多的时候,在一个set中使用多条算式的方法中的算式用时将逼近set命令的耗时,此时新方法就体现出威力了
作者: caruko 时间: 2011-6-5 21:22
学习了..
留贴
作者: applba 时间: 2011-6-6 14:18
“Cmd.exe的数学表达式跟C语言里面的表达式基本上完全一致。
SET /a支持的运算符也跟C语言里面的一样,只是没有了自加一自减一。”
作者: applba 时间: 2011-6-6 14:24
还是python好用,什么都不要,直接当计算器用。
一次赋多个值:
(x,y,z)=(1,2,3)
或者(x,y,z)=range(1,3)
赋值后x=1 y=2 z=3
作者: CrLf 时间: 2011-6-6 15:00
“Cmd.exe的数学表达式跟C语言里面的表达式基本上完全一致。
SET /a支持的运算符也跟C语言里面的一样,只是没有了自加一自减一。”
applba 发表于 2011-6-6 14:18
自加一自减一不就是set /a n+=1,m-=1吗?
作者: Batcher 时间: 2011-6-6 15:09
16# zm900612
他说的是:
i++
i--
++i
--i
作者: applba 时间: 2011-6-6 15:28
本帖最后由 applba 于 2011-6-6 15:29 编辑
虽然+=和++效果上一样,但是区别还是蛮大的。
+=是双目运算,++是单目运算。
作者: plp626 时间: 2011-6-6 15:54
(a=i+=1;)=/=(a=i++;)
==(a=++i)
作者: batpro 时间: 2011-6-7 00:17
小白还在发愣中,膜拜,一年以后再来读懂它
作者: Hello123World 时间: 2011-9-22 21:30
回复 16# CrLf
+=,-=称为复合赋值运算符;如batch所说,自增,自减
作者: cc5511 时间: 2020-8-27 01:13
回复 1# plp626
set /a 的高级用法
学习了
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |