找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 124926|回复: 38

[数值计算] [已解决]批处理使用goto跳出for循环,等待慢,如何解决?

[复制链接]
发表于 2010-12-17 14:08:46 | 显示全部楼层 |阅读模式
参考下面的代码:

  1. @echo off
  2. for /L %%i in (1,1,1000000) do (
  3.     echo %%i
  4.     goto end
  5. )

  6. :end
复制代码
上面的代码在第一次循环的时候就应该跳出来
可是从实际结果来看, 代码(goto end)却执行了挺长时间, 让我感到很困惑.
而且loop越多, 所需时间越长, 也就是与那个1000000有关系.

求解惑~~

===================================================================
看了很多人的回复, 虽然原理还不清楚, 但也差不多明白是怎么个事. 不想把这个问题挂着了.标志为[已解决]

搜索了一下论坛, 关于分解质因数的问题, 得到了改善, 效率应该很快了. 见28L

[ 本帖最后由 gapkiller 于 2010-12-31 11:31 编辑 ]

评分

参与人数 1PB +2 收起 理由
Batcher + 2 感谢给帖子标题标注[已解决]字样

查看全部评分

发表于 2010-12-17 14:30:26 | 显示全部楼层
在这里,goto 不能暂停或终止 for /l 的迭代,必须等待其完成

[ 本帖最后由 hanyeguxing 于 2010-12-17 16:53 编辑 ]
 楼主| 发表于 2010-12-17 15:36:32 | 显示全部楼层
原帖由 hanyeguxing 于 2010-12-17 14:30 发表
无论子句中怎样(语法错误除外),for /l 都会先把数列从1迭代到1000000的。


你的意思是先迭代数列, 然后再执行后面的语句吗?
可是echo %%i却可以立刻显示出来, 后面紧接着的一句"goto end"执行了很长时间.

似乎在for循环与goto语句结合有点问题. 就好像执行了1000000次goto一样.

除了goto还有什么关键字可以跳出for循环呢?
发表于 2010-12-17 16:33:30 | 显示全部楼层
  1. @echo off
  2. for /L %%i in (1,1,1000000) do (
  3.     echo %%i
  4.     call:end
  5. )
  6. :start
  7. echo 其他命令...
  8. pause&exit
  9. :end
  10. goto:start
复制代码
 楼主| 发表于 2010-12-17 18:41:48 | 显示全部楼层
楼上两位使用了exit来退出循环, 并不是我想要的.
问题来源是这样的
我写了一个批处理来分解一个数的质因数, (90=2*3*3*5)
  1. @echo off
  2. setlocal enabledelayedexpansion

  3. :start
  4. echo.
  5. echo.
  6. set /p n=Please input a number:
  7. set /p p=%n%=<nul

  8. set /a m=%n%/2
  9. for /L %%i in (2,1,%m%) do (
  10.   if .%n%==.1 goto start
  11.   call:setn %%i
  12. )
  13. if not .%n%==.1 echo %n%
  14. goto start

  15. :setn
  16. set /a tp=!n!%%%1
  17. if .%tp%==.0 (
  18.   set /p "p=%1"<nul
  19.   set /a n=!n!/%1
  20.   if not .!n!==.1 set /p "p=*"<nul
  21.   goto setn
  22. )
  23. goto :EOF

  24. :end
  25. echo.
  26. pause
复制代码
当输入一个较大的数时, 在计算完成后,总要停留好长一段时间才能退出来.
就是因为if .%n%==.1 goto start好像比较慢, 没有退出来.

[ 本帖最后由 gapkiller 于 2010-12-17 18:56 编辑 ]
发表于 2010-12-18 00:03:12 | 显示全部楼层
  1. @echo off
  2. for /l %%a in (0) do goto :out
  3. :out
  4. pause
复制代码
永远都跳不出来。

大量使用goto语句不是一种好的程序结构。
发表于 2010-12-18 01:08:49 | 显示全部楼层
  1. @echo off&setlocal enabledelayedexpansion
  2. for /l %%a in (2,1,2147483647) do (
  3.     set Xing=
  4.     set Han=%%a
  5.     call:han
  6.     if "!Xing!"=="*%%a" (echo %%a为质数) else echo %%a=!Xing:~1!
  7. )
  8. pause&exit
  9. :han
  10. for /l %%a in (2,1,%Han%) do call:ye %%a
  11. goto:eof
  12. :ye
  13. set/a Ye=%1,Gu=Han%%Ye
  14. if defined #%Ye% goto:xing
  15. if %Gu% neq 0 (goto:eof) else for /l %%a in (2,1,%Ye%) do call:gu %%a
  16. :gu
  17. set/a Gu=Han%%%1
  18. :xing
  19. if %Gu% neq 0 (goto:eof) else (
  20.     set/a Han=Han/Ye
  21.     set Xing=!Xing!*%Ye%
  22.     if not defined #%Ye% set #%Ye%==
  23.     goto:han
  24. )
复制代码

[ 本帖最后由 hanyeguxing 于 2010-12-21 18:57 编辑 ]

评分

参与人数 1技术 +1 收起 理由
gapkiller + 1 乐于助人

查看全部评分

 楼主| 发表于 2010-12-18 14:57:33 | 显示全部楼层
原帖由 powerbat 于 2010-12-18 00:03 发表
@echo off
for /l %%a in (0) do goto ut
:out
pause永远都跳不出来。

大量使用goto语句不是一种好的程序结构。

"大量使用goto语句不是一种好的程序结构。"
头一次听人对批处理说这话~~~
 楼主| 发表于 2010-12-18 15:02:34 | 显示全部楼层
看样子for循环无法迅速跳出了~~~~
发表于 2010-12-19 00:41:44 | 显示全部楼层
>>"大量使用goto语句不是一种好的程序结构。"
>头一次听人对批处理说这话~~~

看来你对程序设计接触得非常少,这应该是一种共识。
发表于 2010-12-19 10:34:02 | 显示全部楼层
忍了半个月,今天来看看大家。
大量使用 goto不是好的程序?这个结论有点绝对,好不好要看使用环境和条件,不管三七二十一就用当然不好,但在该用时不用就更不好,特别是在一些大量重复代码情况下,不大量使用跳转语句就意味着使用大量重复代码,造成语句臃肿。
就楼主的问题,用‘’&‘’可能解决问题,致于原因就大大们解释比较好。
 楼主| 发表于 2010-12-19 20:16:05 | 显示全部楼层
原帖由 powerbat 于 2010-12-19 00:41 发表
>>"大量使用goto语句不是一种好的程序结构。"
>头一次听人对批处理说这话~~~

看来你对程序设计接触得非常少,这应该是一种共识。

看样子, 阁下在批处理里面一定很少使用goto了.
 楼主| 发表于 2010-12-19 20:20:34 | 显示全部楼层
原帖由 cjiabing 于 2010-12-19 10:34 发表
忍了半个月,今天来看看大家。
大量使用 goto不是好的程序?这个结论有点绝对,好不好要看使用环境和条件,不管三七二十一就用当然不好,但在该用时不用就更不好,特别是在一些大量重复代码情况下,不大量使用跳转语 ...

How?
我只想迅速跳出For循环而已.
发表于 2010-12-19 22:32:10 | 显示全部楼层
注意批处理的初衷不是一种程序语言,只是为了方便在DOS中操作而把多个命令写在一个bat文件里进行批量处理、执行,并引入了少许基本的流程控制语句(如if判断文件是否存在或以上一条命令执行结果为条件,for遍历文件),到了Windows NT时代强化了一些命令的功能,但它本质没变。连程序设计语言最基本的函数功能都没有(虽然可用Call来模拟,但只是“模拟”而已),比Linux Shell脚本都远远不如。所以想用批处理实现各种算法根本就是吃力不讨好的事情,虽然有些算法也能实现,但效率上来说几乎没有什么实用性。有这个时间,去学一门程序语言都是有可能的,或者简单点vbs也很容易。
除开算法,需要大量用到goto语句的时候还真是很少(注意goto :eof不算,它相当于exit /b),否则真需要好好考虑一下你所用到的方法。
发表于 2010-12-20 09:31:44 | 显示全部楼层
有些不解。LZ可以利用多个GOTO(用IF和FOR配合)达到目的效果,最后再结束P就像8L那样不是也一样达到效果了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-19 04:59 , Processed in 0.013093 second(s), 9 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表