本帖最后由 wankoilz 于 2011-5-18 14:30 编辑
感谢powerbat讲解。确实!我之前还以为批处理递归没有这种“堆栈”的效果,结果测试了一下还真如楼上所说:每次call 都带来一次循环,那些被call阻挡的,没来得及执行的代码似乎被放入类似“堆栈”的结构里,在call完毕之后都陆续被执行了。测试如下:- @echo off&setlocal enabledelayedexpansion
- call :lp
- pause
-
- :lp
- for /l %%a in (1,1,5) do (
- echo %%a
- set/an+=1&if !n! equ 3 call :lp
- )
复制代码 第一次for:本该执行5次echo%%a,但执行到3的时候被call :lp阻断了(此时echo 4和echo 5被“存”起来了),接着就完整的执行了一次for,完了把存起来的echo 4和echo 5也执行了,所以有如下结果(用空行分隔了一下,方便分析):复制代码 而且这种存储确实是按照类似“堆栈”的方式,即“后进先出”,从下面代码,的执行结果就可以看出来:- @echo off&setlocal enabledelayedexpansion
- call :lp
- pause
-
- :lp
- for /l %%a in (1,1,5) do (
- echo %%a
- set/an+=1
- if !n! equ 3 call :lp
- if !n! equ 5 call :lp
- )
复制代码 结果(用空行分隔了一下,方便分析):- 1
- 2
- 3
-
- 1
- 2
-
- 1
- 2
- 3
- 4
- 5
-
- 3
- 4
- 5
-
- 4
- 5
复制代码 第一个for,执行到3的时候被call阻断,输出1,2,3(echo 4和echo 5被保存),然后执行第二次for,执行到2的时候n等于5了,再次call,这时输出1,2(echo 3,echo 4,echo 5被保存),然后是最后一个完整的for,输出1,2,3,4,5。完了执行被保存的call(后保存的先执行),输出3,4,5和4,5。
这样看来15楼的代码是很不错的! |