Board logo

标题: 请教 for /l 语句中的 set /a 问题 [打印本页]

作者: zhoushijay     时间: 2007-3-9 23:59    标题: 请教 for /l 语句中的 set /a 问题

echo off
set a=0
for /l %%i in (71,1,99) do set /a a+=1 & echo %a%

这里显示%a% 始终都是0  似乎set /a a+=1根本不起作用,请问这是什么原因啊?是不是for /l 中不能使用 set /a ?
作者: zh159     时间: 2007-3-10 00:17
LZ没搞懂用法

@echo off
set a=0
for /l %%i in (71,1,99) do set /a a+=1
echo %a%
pause

如果要在同一行使用,必需要启用延迟变量(具体搜索论坛)
作者: youxi01     时间: 2007-3-10 01:41
@echo off
set a=0
for /l %%i in (71,1,99) do set /a a+=1 & call echo %%a%%

pause>nul
作者: oilio     时间: 2007-3-11 01:54
我也有一个不明白的地方,“set /a a+=1”,这句是啥意思啊?关键是a+=1这个用法是干什么的?哪位知道的朋友告诉我一下,谢谢了。
作者: zhoushijay     时间: 2007-3-11 02:00
set /a a+=1 意思等于 set /a a=%a%+1
作者: oilio     时间: 2007-3-11 08:19
谢谢楼上的这位朋友。
作者: lxmxn     时间: 2007-3-11 08:34


  Quote:
Originally posted by oilio at 2007-3-10 12:54:
我也有一个不明白的地方,“set /a a+=1”,这句是啥意思啊?关键是a+=1这个用法是干什么的?哪位知道的朋友告诉我一下,谢谢了。

  学过其它的编程语言的朋友可能一看就知道这样的用法,其它类似的用法还有很多,比如:set /a a*=2、set /a a-=5等等,分别表示set /a a=a*2、set /a a=a-5,一般把set /a a+=1成为累加器,每运行一次a的值就加1,主要用来控制程序流程的。
作者: oilio     时间: 2007-3-11 09:21
谢谢lxmxn兄,真不知道说什么好,谢谢!这是我N次看到这个用法,因为之前一直都很弱,现在水平比以前稍微好那么一点,今天再看到这个用法觉得到时候了,忍不住想问,谢谢各位,尤其谢谢lxmxn兄列出好几个列子,lxmxn兄说到累加器,我想那这个批处理用到set /a a+=1,其实主要作用就是计算从71步长值是1递增到99,一共递增了28次,但要得到数字总的个数,次数不包括71本身,所以计算一共是多少个数字就会少一个,所以这里用到set /a a+=1, 不知道我理解的对不对?看样子今天是赚了,一下明白俩。我实践一下,加深印象去了。再次感谢各位。

[ Last edited by oilio on 2007-3-10 at 09:14 PM ]
作者: lxmxn     时间: 2007-3-11 09:37


  Quote:
Originally posted by oilio at 2007-3-10 20:21:
谢谢lxmxn兄,真不知道说什么好,谢谢!这是我N次看到这个用法,因为之前一直都很弱,现在水平比以前稍微好那么一点,今天再看到这个用法觉得到 ...

  兄不必这么客气啊,大家都在论坛里也是个缘分,共同学习共同进步嘛。

  看到兄这些时的进步不小,真为兄感到高兴。

作者: lxmxn     时间: 2007-3-11 10:03


  Quote:
Originally posted by oilio at 2007-3-10 20:21:
我想那这个批处理用到set /a a+=1,其实主要作用就是计算从77步长值是1递增到99,一共递增了28次,但要得到数字总的个数,次数不包括71本身,所以计算一共是多少个数字就会少一个,所以这里用到set /a a+=1, 不知道我理解的对不对?

  兄的理解有点偏差,这里一共是递增了99-71+1=29次,因为 for /l 循环包含了第一个数字,这里是71,你可以用for /l %a in (1,1,29) do 来试试,结果应该是一样的。set /a a+=1 的作用并不是使其递增数加一,而是使 a 的值没循环一次就增加1,这里循环了29次,所以结果最后应该是29了。
作者: oilio     时间: 2007-3-11 10:13
好像不对啊,我想了一下,假如是for /l %a in (1,1,3)的话,从1到2是递增了1次,从2到3是递增第二次,一共是两次才对啊,这里确实是三个数,但应该递增次数是2次吧。这个命令应该是计算从1到3的个数的吧?不知道是不是我的理解力有问题,呵呵。有的时候感觉挺聪明,有的时候感觉钻牛角尖了,嘿嘿!累了,睡觉了,我再好好想想,说不定我休息一下就能想明白,呵呵。谢谢lxxm兄的回帖,使我收获良多。
作者: zhoushijay     时间: 2007-3-11 10:15
for /l %a in (1,1,3) do
当%a=1时 计一次
当%a=2时 计一次
当%a=3时 计一次
所以应该是3次
作者: oilio     时间: 2007-3-11 10:19
谢谢,周仕杰兄,原来我的问题出在这儿,关键是我说到递增,把这个给忘了。第一个数就开始计数的话,那就对了,是我自己把自己绕进去了,哈哈。谢谢。
作者: 6622186     时间: 2007-3-15 11:14
我以前也试了很多次, 不能在同一行使用, 原来用变量延迟就可以了. 具体怎么用啊?
作者: zh159     时间: 2007-3-15 11:38
这里变量延迟有两种使用方式:
1、启用变量延迟:

@echo off
setlocal EnableDelayedExpansion
set a=0
for /l %%i in (71,1,99) do set /a a+=1&echo !a!
pause>nul

2、用call

@echo off
set a=0
for /l %%i in (71,1,99) do set /a a+=1&call echo %%a%%
pause>nul
作者: wxjlotus     时间: 2007-3-19 06:04
这个CALL有点搞不懂!
作者: 13579246810     时间: 2007-4-3 02:40
路过 学习了 谢谢各位大师的赐教