注册
登录
论坛
搜索
帮助
导航
私人消息 (0)
公共消息 (0)
论坛任务 (0)
系统消息 (0)
好友消息 (0)
帖子消息 (0)
批处理之家
»
BAT求助&讨论
» [已解决]批处理复合语句中是否能使用跳转语句?
[新手上路]
批处理新手入门导读
[视频教程]
批处理基础视频教程
[视频教程]
VBS基础视频教程
[批处理精品]
批处理版照片整理器
[批处理精品]
纯批处理备份&还原驱动
[批处理精品]
CMD命令50条不能说的秘密
[在线下载]
第三方命令行工具
[在线帮助]
VBScript / JScript 在线参考
返回列表
发帖
namejm
发短消息
加为好友
namejm
(闭关中)
当前离线
批处理代码写手
UID
5
帖子
1348
精华
8
积分
5183
PB
4236
技术
142
捐助
501
阅读权限
254
来自
四川-成都
在线时间
1842 小时
注册时间
2007-10-25
最后登录
2013-6-19
荣誉版主
帖子
1348
积分
5183
技术
142
捐助
501
注册时间
2007-10-25
1
楼
跳转到
»
发表于 2010-2-23 15:24
|
显示全部帖子
实际上,这个代码并没有乱跳,而是遵循了cmd语句执行的基本规则:
1、for语句中,in……do之间括号中的元素个数决定了do之后括号内所有语句的执行次数,只有当do后所有语句都执行完毕之后,才跳出for循环,执行for语句的下一条语句;
2、goto语句是跳转语句,决定了流程的走向,当它跳转到指定标签后,就自顶向下,逐一执行该标签之后的所有语句,直到文件结尾,除非其间碰到下一条跳转语句才改变这个流程方向。
3、goto循环的优先级高于for循环,也就是说,如果在for语句内部有goto流程跳转语句,将遵循goto的跳转流程,而不必等待for内部循环是否执行完毕。
根据这3条规则,再来分析顶楼的代码就十分好理解了(为了方便演示整个过程,请在最后添加暂停语句pause。):
1、当输入abc的时候,在for语句内部碰到了第一条if语句,判断的结果是str被赋值了,所以,执行 :loopstr 标签段。需要注意的是,:loopstr标签段的作用范围是 :loopstr 和 :endloopstr 之间的语句。在 :loopstr 标签段中,str的值逐次被去掉第一位字符,最终得到空值,结果, :loopstr 标签段循环完之后,就跳转到 :endloopstr 标签段。:endloopstr 标签段的作用范围是作用至文件尾,所以,会执行其后的5行代码,结果,就在屏幕上显示了双横线。回过头来看,在str被赋值的时候,这条for语句是被分成了三大块来执行的:第1块是整个for语句,无需多说;第2块是:loopstr标签段,第3块是 :endloopstr 标签段。由于goto语句的跳转,for语句就被割裂成这3大块来执行,与call调用了一段子程序之后会回过头来执行它的下一句大不一样,goto语句是跳出去之后就不回头的(除非另一条跳转语句又让它跳回来),所以,当str被赋值的时候,for语句不会在内部执行3次do后的语句,而是在第1次执行的时候,就用goto语句跳出了for循环的;
2、当str没有被赋值的时候,for语句内部do后的语句块,第一条if语句没有执行else之前的语句,而是执行了else之后的语句,所以,第1次会显示双横线;因为没有goto语句跳转,for语句继续在内部循环,再次提示你输入,结果会重复第1条或本条的过程,如此循环往复,当每次都没有输入任何字符的时候,for语句将在屏幕上显示3次双横线。换而言之,for把3次内部循环完整地执行了。
1
评分人数
summerflower:
感谢
PB + 6
技术 + 1
尺有所短寸有所长,学好批处理没商量;
考虑问题复杂化,解决问题简洁化。
心在天山,身老沧州。
TOP
返回列表
批处理专区: BAT CMD DOS
BAT求助&讨论
BAT教程&资料
BAT原创&转载
BAT新大陆
BAT转载代码
新手练功
出题挑战
有偿求助
第三方命令行
开源原创工具
iBAT
Take Command
其他脚本区
PowerShell求助&讨论
PowerShell教程&资料
PowerShell原创&转载
VBS求助&讨论
JS / JScript / JavaScript
VBS教程&资料
VBS原创&转载
UNIX/Linux Shell
Python
Perl
网络资源区
电脑技术研讨
精品软件交流
论坛事务区
站务交流
意见反馈
论坛公告
版主申请
交换链接
建站杂谈
活动专区
论坛总版规
[收藏此主题]
[关注此主题的新回复]
[通过 QQ、MSN 分享给朋友]