[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
既然从贴吧转发过来了,我也把我的评论转发过来:
我想谈谈Goto并纠正一些错误的观点。
作者所谈及的“少用 call 和 goto”,call我就不说了,在必要的时候还得用,不必要的地方影响效率。至于goto,我认为楼主没有在标题注明在什么情况下少用goto,以及内容中没有解释清楚为什么少用goto。最主要的一个失误就是,“少用 call 和 goto”这个标题误导了许多人,使得人们以为goto是多么的不好,能不用尽量不用。
如楼主提供的例子,例子中用goto肯定不如用for。但这只是一个方面。像“set /p var=&if %var%==yes goto end”这种没有goto不方便,用FOR多此一举。因此,楼主仅仅以FOR代替GOTO这单方面的原因来否定GOTO,以此强调少用GOTO是有欠严谨的,有点以偏概全。
楼主虽然用了“少用”二字,但从影响结果而言,以及从其他地方了解的情况来看,这个“少用”二字并未能消除人们对GOTO命令的偏见。内容比较具体,但标题有点夸大了。因此,我希望楼主在讲解这方面的内容时,能够从GOTO本身意义和效率来谈,解释清楚是何种条件下“少用 call 和 goto”,而不能胡乱一句话就搪塞完了。



2011-09-03 01:42 回复  

cjiabing
10位粉丝 24楼

另外再谈谈Call与Goto的区别。
两者都可以跳转,但Call功能更多,而Goto比较单调。最明显的区别在于,Call有去有回,而Goto有去无回。具体原因我不是很明了,但Call在执行跳出去的时候,已经做了一个标记,用于遇到goto :eof时找到返回的位置。因此,Call在时间(命令执行先后顺序)上多了一个操作,这个操作在多层Call中是很明显的,Call从原位置跳出去了,他仍然时刻想着跳回去。这个原理使得Call可能占据了更多空间环境。而Goto则比较简单,他跳出去了就不用考虑往回跳,省去了这个标记和返回的过程。
一直想谈谈如何中止FOR的循环,楼主例二提供了两个很好的例子。FOR+Call,因为CALL的特性,使得可以确保FOR进程的前提下,获得对FOR进程的更好的干预。FOR+Goto,因为Goto不具有CALL的特性,GOTO无法嵌到FOR当中,因此,只能等FOR预处理完了才能GOTO。
在FOR中,CALL可以跳出FOR循环外,并能够在遇到GOTO :EOF时返回FOR中,继续FOR的进程。但GOTO只能跳出循环外,而不能返回FOR当中。
受两者命令自身特性的影响,它们在FOR中有着各自不同的用法。GOTO必须等FOR预处理完才能执行,而CALL可以在预处理的同时执行,但是,CALL也有一个缺点,就是它必须做一个用于返回的标记,这个有点类似于环境变量延迟,因此,有时候CALL外部命令时,它的效率也是十分差的。特别是在FOR中进行多个CALL时,它的效率会明显地下降。
因此,在大循环中避免使用GOTO只能当做一条不是很充分的条件,在许多情况下可以避免使用,但不是不能使用。还是那句话,在该使用GOTO的时候还是需要使用GOTO,在该使用CALL的时候还是需要使用CALL。灵活地熟练地应用两者才能在FOR中,在批处理中获得更大的发展空间。
寂寞是黑白的,但黑白不是寂寞,是永恒。BAT 需要的不是可能,而是智慧。

TOP

回复 8# plp626


    感觉他说的话就是真理,没办法啊。还要再做多方面验证,不过许多都是很有价值的。
寂寞是黑白的,但黑白不是寂寞,是永恒。BAT 需要的不是可能,而是智慧。

TOP

返回列表