Board logo

标题: [其他] [已解决]批处理如何在嵌套的for语句中实现c语言中的break? [打印本页]

作者: fish    时间: 2010-7-27 23:19     标题: [已解决]批处理如何在嵌套的for语句中实现c语言中的break?

比如有这样一个题目:(题目是我瞎掰的,各位老师莫见笑哈)
有这样一种检查,检查从1~3中的数,每检查一个数echo一下,如果遇到2的倍数就输出ok,然后停止echo后面的所有数,这种检查要重复3次!
理想中的结果应该是这样的:
1
2
ok
1
2
ok
1
2
ok

于是我怀着这样的理想写了如下代码:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /l %%j in (1,1,3) do (
  4.     for /l %%i in (1,1,3) do (
  5.         echo %%i
  6.         set /a r=%%i%%2
  7.         if !r!==0 call :ok
  8.     )
  9. :ok
  10. echo ok
  11. )
  12. pause
复制代码
结果大错特错
我知道了用goto不行,goto会跳出所有循环,那么用call该如何实现呢?请求各位老师帮忙,并且详细解释一下原理,晚辈在此多谢了!

[ 本帖最后由 fish 于 2010-7-28 04:48 编辑 ]
作者: broly    时间: 2010-7-27 23:29

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /l %%j in (1,1,3) do (
  4. for /l %%i in (1,1,3) do (
  5. if %%i leq 2 echo %%i
  6. set /a r=%%i%%2
  7. if !r!==0 echo ok
  8. )
  9. )
  10. pause
复制代码

作者: fish    时间: 2010-7-28 00:09

楼上的前辈的代码是可以实现结果,可是没有实现我的题目啊,在没作计算前,您怎么知道显示小于等于2的数呢,您这个代码通用性不强,也没能实现c语言中的break啊,还求继续指点迷津,多谢!
作者: lxin    时间: 2010-7-28 00:17

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /l %%j in (1,1,3) do (
  4.     for /l %%i in (1,1,3) do (
  5.         echo %%i
  6.         set /a r=%%i%%2
  7.         if !r!==0 call :ok
  8.     )
  9. )
  10. pause
  11. goto :eof
  12. :ok
  13. echo ok
  14. goto :eof
复制代码

使用call必须用goto :eof来代表return,
作者: fish    时间: 2010-7-28 00:58

楼上前辈的代码也有问题,最后一个goto :eof没什么用吧,已经到文件末尾了,为什么还用goto eof?还有您这代码显示的结果与我理想中的结果就不一致啊,您不应该把3也显示出来啊,也就是说call命令调用后又回到了for循环里,您并没有跳出for循环啊,继续请您指点迷津。。。
作者: caruko    时间: 2010-7-28 01:15

goto :eof 其实是相当于Continue的效果,跳转到结尾。
你测试如下代码,就知道如何return call了
  1. call :aa &&echo aa is true! || echo aa is false!
  2. call :bb &&echo bb is true! || echo bb is false!
  3. pause&exit
  4. :aa
  5. exit /b 0
  6. echo not retrun aa!
  7. goto :eof
  8. :bb
  9. exit /b 1
  10. echo not retrun bb!
复制代码
那么试试下面的
  1. @echo off&setlocal enabledelayedexpansion
  2. for /l %%i in (1,1,3) do call :loop && echo ok! || echo 3次检查中不存在2的倍数。
  3. pause&goto :eof
  4. :loop
  5. for /l %%a in (1,1,3) do (
  6.        echo %%a
  7.        set /a r=%%a%%2
  8.         if !r! equ 0 exit /b 0
  9. )
  10. exit /b 1
复制代码

[ 本帖最后由 caruko 于 2010-7-28 01:20 编辑 ]
作者: fish    时间: 2010-7-28 04:46

多谢caruko前辈指点,exit /b用的妙极,基本明白了实现的方法,但是不太同意“goto :eof 其实是相当于Continue的效果,跳转到结尾。”这个说法,我依旧认为是goto到脚本文件末尾,总之此贴已结,感谢回答问题的所有前辈,再次感谢!
作者: caruko    时间: 2010-7-28 10:50

goto :eof 如果在 括号内,就等于括号结束。

因此,在for 循环中的goto :eof 就等于直接结束该次循环,忽略后面的代码。所以说它对于for是Continue 是没错的。

如下:
当%%a=3的时候,跳过了后面 ) 前的代码,但是loop的最后一句不在()内,不会跳过。
因此它输出
1 is not skip
2 is not skip
4 is not skip
5 is not skip
not skip this。
...
  1. @echo off&setlocal enabledelayedexpansion
  2. for /l %%i in (1,1,3) do call :loop
  3. pause&goto :eof
  4. :loop
  5. for /l %%a in (1,1,5) do (
  6.         if %%a equ 3 goto :eof
  7.         echo %%a not skip!
  8. )
  9. echo not skip this。
复制代码

作者: fish    时间: 2010-7-28 12:27

但是我执行的结果与caruko前辈的不一样啊,
1 not skip
2 not skip
1 not skip
2 not skip
1 not skip
2 not skip
请按任意键继续. . .
所以我还是坚持我的看法,哈哈,多谢caruko前辈指教了!




欢迎光临 批处理之家 (http://bathome.net./) Powered by Discuz! 7.2