[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[数值计算] [已解决]批处理set /a中的逗号的作用?

今天在本论坛学习的时候,看见了关于打印国际象棋的棋盘:

【程序9】
题目:要求输出国际象棋棋盘。
1.程序分析:用i控制行,j来控制列,根据i+j的和的变化来控制输出黑方格,还是白方格。
http://www.bathome.net/thread-850-1-1.html
答案:见36楼

答案是这样的:
  1. @echo off &setlocal enabledelayedexpansion
  2. for /l %%i in (1,1,8)do (
  3.         for /l %%j in (1,1,8) do (
  4.         set /a n=%%i+%%j,n=n%%2
  5.         if !n! equ 1 (set/p=■<nul) else (set/p=  <nul)
  6.         )
  7.         echo.
  8. )
  9. pause>nul
复制代码
它的算法很简单我能明白,但是对这个set /a 里面的逗号后面的n=n%%2不太明白,为什么不是n=!n!%%2??难道是因为逗号的存在就不用!!括起来?逗号隔开的是两条语句还是一条语句的两部分?
1

评分人数

    • Batcher: 感谢给帖子标题标注[已解决]字样PB + 2

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
寒夜孤星:在没有说明的情况下,本人所有代码均运行在 XP SP3 下 (有问题请发贴,QQ临时会话已关闭)

TOP

要是不规定死必须用xy轴定位,那是多么简单的事啊
  1. @echo off &setlocal enabledelayedexpansion
  2. for /l %%i in (1,1,8)do (
  3. if "!b!"=="" (set b=■) else set b=
  4. echo !b! ■ ■ ■
  5. )
  6. pause>nul
复制代码
  1. @echo off &setlocal enabledelayedexpansion
  2. set p= ■ ■ ■
  3. for /l %%i in (1,1,8)do (
  4.         set /a n=%%i%%2
  5.         if !n! equ 1 set /p=■<nul
  6.         echo !p!
  7. )
  8. pause>nul
复制代码

TOP

2# hanyeguxing

我可以这样理解吗:
也就是说用了!n!或者%n%括起来只是对set /a前面语句中的n进行引用,而不用!!或者%%括起来就对set /a这句中之前的n进行引用。。有一点相当于开启环境变量延迟扩展,感知一条语句中变量的变化的意思。。当然只是这样理解。。实际上不是这样的。。我不知道可不可以这样理解?

TOP

本帖最后由 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时边执行边解释,两者是截然不同的。
1

评分人数

TOP

本帖最后由 abcdshenji 于 2011-4-22 13:12 编辑

5# zm900612


确实,你说的这点我也隐约感觉到了,只是很模糊,不知道怎么表达,现在你说分为先解释后执行和边执行边解释两种情况我就清楚了。。谢谢zm900612 老师!

TOP

返回列表