-
- @echo off&color a&setlocal enabledelayedexpansion
- set a=3232
- set n=1
- for /l %%a in (!a! 1 !a!) do (
- set /a n*=10
- set /a c=!a!/!n!
- if !c! equ 0 (set /a a=!a!-1) else (set str=!str!0&set /a a=!a!+1)
- )
- echo %str%
- echo %a%
- pause
复制代码 分析代码可以看出,你写的这段代码的结果是%str%的值等于0,%a%的值等于3233.原因是什么?其实原因不是你想的那么复杂,什么开始,结尾,改变不改变的. 真正的原因就是: 在for语句之前,并没有给str 赋值,所以%str%的值是0,而%a%之所以是3233,是因为set /a a=!a!+1 这一句.!a!的值是3232,所以%a%的值就是3233.因为!c!的值不会等于0.所以执行set /a a=!a!+1.其实这里的!a!完全可以写成%a%,因为!!一点作用没起到;a的值一直是3232,因为a在for语句中的值一直没有改变过,还是for之前定义的a=3232;所以set /a a=!a!+1 这一句实际上就是a=%a%+1 其中的%a%的值是一开始定义过的3232,所以set /a a=!a!+1 以后
%a%的值就是3233了. 有人可能要问,最后的echo %a%没有在for语句之中,为什么不是3232?也就是为什么echo %a% 显示的不是一开始定义的set a=3232的值.因为,批处理中,执行命令时,变量值的继承是以离自己最近的一层,也就是上一个语句的值来继承的.举个例子这段代码:- @echo off
- set a=1
- set a=22222
- echo %a%
- pause
复制代码 你说%a%的值会是什么?一看就明白了!
[ 本帖最后由 bat_521 于 2010-9-24 23:22 编辑 ] |