标题: [数值计算] [已解决]批处理set /a中的逗号的作用? [打印本页]
作者: abcdshenji 时间: 2011-4-21 21:49 标题: [已解决]批处理set /a中的逗号的作用?
今天在本论坛学习的时候,看见了关于打印国际象棋的棋盘:
【程序9】
题目:要求输出国际象棋棋盘。
1.程序分析:用i控制行,j来控制列,根据i+j的和的变化来控制输出黑方格,还是白方格。
http://www.bathome.net/thread-850-1-1.html
答案:见36楼
答案是这样的:- @echo off &setlocal enabledelayedexpansion
- for /l %%i in (1,1,8)do (
- for /l %%j in (1,1,8) do (
- set /a n=%%i+%%j,n=n%%2
- if !n! equ 1 (set/p=■<nul) else (set/p= <nul)
- )
- echo.
- )
- pause>nul
复制代码
它的算法很简单我能明白,但是对这个set /a 里面的逗号后面的n=n%%2不太明白,为什么不是n=!n!%%2??难道是因为逗号的存在就不用!!括起来?逗号隔开的是两条语句还是一条语句的两部分?
作者: hanyeguxing 时间: 2011-4-21 22:03
1,逗号用不用都是一条语句
2,在set /a运算时,除%random%等特殊动态变量,其他变量名都可以不用!和%括起来
3,set/a n=n+1,n=n+3 和 set/a n=!n!+1,n=!n!+3 是不同的。第一个中,对n加1,然后再加3,第二个里对n加1,然后对原来(即未加1)的n加3。
4,set/a n=n+1可以写成set/a n+=1,同理set/a n=n%%3可以写成set/a n%%=3
作者: CrLf 时间: 2011-4-21 23:08
要是不规定死必须用xy轴定位,那是多么简单的事啊- @echo off &setlocal enabledelayedexpansion
- for /l %%i in (1,1,8)do (
- if "!b!"=="" (set b=■) else set b=
- echo !b! ■ ■ ■
- )
- pause>nul
复制代码
- @echo off &setlocal enabledelayedexpansion
- set p= ■ ■ ■
- for /l %%i in (1,1,8)do (
- set /a n=%%i%%2
- if !n! equ 1 set /p=■<nul
- echo !p!
- )
- pause>nul
复制代码
作者: abcdshenji 时间: 2011-4-22 12:46
2# hanyeguxing
我可以这样理解吗:
也就是说用了!n!或者%n%括起来只是对set /a前面语句中的n进行引用,而不用!!或者%%括起来就对set /a这句中之前的n进行引用。。有一点相当于开启环境变量延迟扩展,感知一条语句中变量的变化的意思。。当然只是这样理解。。实际上不是这样的。。我不知道可不可以这样理解?
作者: CrLf 时间: 2011-4-22 12:55
本帖最后由 zm900612 于 2011-4-22 12:56 编辑
2# hanyeguxing
我可以这样理解吗:
也就是说用了!n!或者%n%括起来只是对set /a前面语句中的n进行引用,而不用!!或者%%括起来就对set /a这句中之前的n进行引用。。有一点相当于开启环境变量延迟扩展,感知一条 ...
abcdshenji 发表于 2011-4-22 12:46
有一点一定要搞明白的,就是解释变量的动作是发生在预处理一条语句时还是执行语句时,set /a中的变量,若表示变量的字符带有!或%是在执行set /a之前解释的,若只有纯粹的变量名,是执行set /a时边执行边解释,两者是截然不同的。
作者: abcdshenji 时间: 2011-4-22 13:10
本帖最后由 abcdshenji 于 2011-4-22 13:12 编辑
5# zm900612
确实,你说的这点我也隐约感觉到了,只是很模糊,不知道怎么表达,现在你说分为先解释后执行和边执行边解释两种情况我就清楚了。。谢谢zm900612 老师!
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |