[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
还有,我想知道的是,如果在迫不得已的情况下,我必须在复合语句中使用跳转,那么上面乱跳的情况还是会出现

请问各位高手怎么解决?
我是一只小菜鸟,飞到东来飞到西……

TOP

  实际上,这个代码并没有乱跳,而是遵循了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

评分人数

尺有所短寸有所长,学好批处理没商量;
考虑问题复杂化,解决问题简洁化。

心在天山,身老沧州。

TOP

) else (
                        goto endLoopStr
                )
                :endLoopStr
不是纯属多余吗?
o(∩_∩)o...~~~
空间:http://hi.baidu.com/fair_jm
喜欢批处理的没事的话去逛逛哦~~

TOP

回复 17楼 的帖子

namejm  久闻大名,怪不得youxi01站长把 站长的位置交与你托管.你确实水平大大地高.从你对语句的分析和讲解,可以看出你的水平厉害,表达能力特别好,让人一看就懂.批处理之家让你来管,绝对可靠
!

TOP

返回列表