标题: [其他] [已解决]批处理如何在嵌套的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
于是我怀着这样的理想写了如下代码:- @echo off
- setlocal enabledelayedexpansion
- for /l %%j in (1,1,3) do (
- for /l %%i in (1,1,3) do (
- echo %%i
- set /a r=%%i%%2
- if !r!==0 call :ok
- )
- :ok
- echo ok
- )
- pause
复制代码
结果大错特错
我知道了用goto不行,goto会跳出所有循环,那么用call该如何实现呢?请求各位老师帮忙,并且详细解释一下原理,晚辈在此多谢了!
[ 本帖最后由 fish 于 2010-7-28 04:48 编辑 ]
作者: broly 时间: 2010-7-27 23:29
- @echo off
- setlocal enabledelayedexpansion
- for /l %%j in (1,1,3) do (
- for /l %%i in (1,1,3) do (
- if %%i leq 2 echo %%i
- set /a r=%%i%%2
- if !r!==0 echo ok
- )
- )
- pause
复制代码
作者: fish 时间: 2010-7-28 00:09
楼上的前辈的代码是可以实现结果,可是没有实现我的题目啊,在没作计算前,您怎么知道显示小于等于2的数呢,您这个代码通用性不强,也没能实现c语言中的break啊,还求继续指点迷津,多谢!
作者: lxin 时间: 2010-7-28 00:17
-
- @echo off
- setlocal enabledelayedexpansion
- for /l %%j in (1,1,3) do (
- for /l %%i in (1,1,3) do (
- echo %%i
- set /a r=%%i%%2
- if !r!==0 call :ok
- )
- )
- pause
- goto :eof
- :ok
- echo ok
- 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了- call :aa &&echo aa is true! || echo aa is false!
- call :bb &&echo bb is true! || echo bb is false!
- pause&exit
-
- :aa
- exit /b 0
- echo not retrun aa!
- goto :eof
-
- :bb
- exit /b 1
- echo not retrun bb!
复制代码
那么试试下面的- @echo off&setlocal enabledelayedexpansion
- for /l %%i in (1,1,3) do call :loop && echo ok! || echo 3次检查中不存在2的倍数。
- pause&goto :eof
-
- :loop
- for /l %%a in (1,1,3) do (
- echo %%a
- set /a r=%%a%%2
- if !r! equ 0 exit /b 0
- )
- 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。
...- @echo off&setlocal enabledelayedexpansion
- for /l %%i in (1,1,3) do call :loop
- pause&goto :eof
-
- :loop
- for /l %%a in (1,1,5) do (
- if %%a equ 3 goto :eof
- echo %%a not skip!
- )
- 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 |