dos for循环嵌套 以及continue和break的讨论

本文介绍批处理中如何使用嵌套循环,并提供实例演示如何通过调用子程序来传递参数实现循环控制。此外还探讨了continue和break语句的使用方法。

一、概述

  批处理中经常会需要嵌套的for循环,但其用法与c语言是有区别的。在c语言中我们可以很轻松的写出嵌套的for循环:

 int i;
  int j;
  for(i=0;i<5;i++)
     for(j=0;j<i;j++)
          do something;
           continue  or   break;

很不幸的是,在批处理中外层循环的变量i是无法在内层循环中直接使用的,我们可以通过call命令,传参数的方式来做到。

二、主要内容

1.例子一:将12345循环输出n次。效果如下:

1

1 2

1 2 3

1 2 3 4

1 2 3 4 5   

脚本如下:

@echo off
for /l %%i in (1,1,5) do call :printnum %%i
echo 完毕!
pause

:printnum 
for /l %%j in (1,1,%1) do set /p=%%j<nul
echo,
goto :eof

外层循环通过call调用子程序进入第二层循环,并将%%i作为参数,传递进去。内层循环通过%1使用第一个参数,也就是%%i。

2.既然有循环那么就有continue和break,continue结束本次迭代,进入到下次迭代中。break则是跳出本循环。

先讲break,它可以通过exit /b实现,例如我们每次都不要输出3,在等于3的时候就直接break掉。那么效果就应该是:

1

1 2

1 2 

1 2 4

1 2 4 5

完毕!

实际效果:

1

1 2

1 2 1 21 2完毕!

脚本如下:

@echo off
for /l %%i in (1,1,5) do call :printnum %%i
echo 完毕!
pause

:printnum 
for /l %%j in (1,1,%1) do (
 if %%j equ 3  exit /b
 set /p=%%j<nul
)
echo,
goto :eof


分析:当i从3开始的时候,内存循环先输出12,当j==3的时候,执行exit /b退出了子程序。所以最好是子程序全部是循环要做的事情,否则exit /b之后的,子程序里循环外的东西都会跳过。上面例子中循环外的的echo,就被跳过了,所以后面输出都是连在一起了。下面链接中给出的讨论break的方法就是如此情形:http://bathome.net/thread-8739-1-1.html,其实这句exit /b跟goto :eof的效果是一样的,都是直接到文件末尾,并不是跳出循环。至于他们说goto :eof就类似于continue,我认为不是这样,它更像return。

       关于contiue暂时没有解决办法(break也是诸多限制),以后有进展再补充。

补充   2016.7.18

当时写这篇文章的时候使用的操作系统是Windows Server 2008 R2,现在使用的是Win 10操作系统,发现可以在内层循环中直接使用外层循环变量了。那么例子1中的代码就可以像下面这样写:

@echo off
for /l %%i in (1,1,5) do (
    for /l %%a in (1,1,%%i) do (
	  set /p=%%a<nul
    )
     echo.
)
pause

运行结果:


关于contiue其实可以反过来思考,之前是不合符条件的跳过,继续下次循环,现在是符合条件的运行,不符合的什么都不做,也就达到了continue的目的。例子2中的代码改写如下:

@echo off
for /l %%i in (1,1,5) do (
    for /l %%a in (1,1,%%i) do (
	  if not %%a==3 (
	     set /p=%%a<nul
	  )	  
    )
     echo.
)
pause

运行结果:


<think>嗯,用户的问题是关于在嵌套for循环中,continuebreak关键字的作用范围。他们想知道这两个关键字分别影响哪一层循环,并且需要示例解析。首先,我需要确认自己对这两个关键字的理解是否正确。 记得break是用来立即终止当前所在的循环结构,而continue则是跳过当前迭代的剩余代码,进入下一次循环。但问题是在嵌套循环的情况下,它们的行为是怎样的呢? 比如,如果有一个两层的循环,外层内层,如果在内层循环中使用break,那是不是只会跳出内层循环,然后继续执行外层循环的下一次迭代?而continue的话,同样在内层使用的话,会跳过内层当前迭代,继续内层的下一个迭代,对吧? 那用户可能需要具体的代码示例来直观看到效果。比如,外层循环i从0到2,内层循环j从0到2。如果在某个条件下在内层使用break,那么内层循环会终止,外层继续。如果是continue,则内层循环的当前j迭代被跳过,继续下一个j的值。 不过,用户可能也会混淆,如果在多层嵌套中,比如三层循环break跳出最内层还是所有层?根据我的知识,break只会影响它所在的最内层循环,不会影响到外层。同样,continue也只影响当前所在的循环层。 可能需要举一个具体的例子,比如打印ij的值,当满足某个条件时使用breakcontinue,然后观察输出结果的变化。这样用户就能清楚地看到两者的区别。 另外,用户可能还想知道如何强制跳出多层循环。比如,使用标签或者在外部设置标志变量。这部分虽然不是直接的问题,但可以作为补充信息,帮助用户更好地理解控制流。 需要确保示例代码简洁明了,用中文注释,并且结果说明清晰。同时,要引用相关的资料来支持解释,比如引用之前提到的关于breakcontinue循环中的作用的资料。 最后,生成相关问题的时候,应该围绕嵌套循环中的控制语句,可能涉及如何跳出多层循环continuebreak的区别,以及实际应用中的例子等。</think>### 嵌套for循环中`continue``break`的作用范围解析 #### 1. **关键字作用范围** - **`break`**: 直接终止**当前所在层**的循环,跳转到该循环之后的代码执行。 - **`continue`**: 仅跳过**当前所在层**的循环体剩余代码,直接进入下一次迭代。 #### 2. **嵌套循环示例解析** 以下是一个包含两层循环的Python代码示例,演示两者的具体行为: ```python # 外层循环(i循环for i in range(3): print(f"外层循环i={i}") # 内层循环(j循环for j in range(3): if j == 1: # 在此处切换测试 breakcontinue break # 或 continue print(f" 内层循环j={j}") ``` ##### **情景1:内层使用`break`** ```python if j == 1: break ``` **输出结果**: ``` 外层循环i=0 内层循环j=0 外层循环i=1 内层循环j=0 外层循环i=2 内层循环j=0 ``` **解析**:当内层循环执行到`j=1`时触发`break`,直接终止内层循环(j循环),但外层循环(i循环)继续执行下一轮[^1][^2]。 ##### **情景2:内层使用`continue`** ```python if j == 1: continue ``` **输出结果**: ``` 外层循环i=0 内层循环j=0 内层循环j=2 外层循环i=1 内层循环j=0 内层循环j=2 外层循环i=2 内层循环j=0 内层循环j=2 ``` **解析**:当内层循环执行到`j=1`时触发`continue`,跳过本次循环剩余代码(即不打印`j=1`),但内层循环继续执行`j=2`的迭代[^2]。 --- #### 3. **强制跳出多层循环的方法** 若需跳出多层嵌套循环,可通过以下方式实现: 1. **标志变量法**: ```python exit_flag = False for i in range(3): for j in range(3): if 触发条件: exit_flag = True break if exit_flag: break ``` 2. **函数封装法**: ```python def nested_loop(): for i in range(3): for j in range(3): if 触发条件: return # 直接退出函数 ``` ---
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值