Do[ statements ][ Exit Do ][ statements ]Loop While condition
Do[ statements ][ Exit Do ][ statements ]Loop Until condition
这两种 Do ... Loop While/ Until 循环结构与前两天讨论的 Do While/Until ... Loop 循环结构不同:- Do While/Until condition ... Loop:进入循环前先测试条件,如果条件不满足,则跳过循环。
- Do ... Loop While/Until condition:先进入循环,然后再测试条件,即使条件不满足,也已经做过一次循环。
从这个区别可以看出,如果循环需要至少执行一次的话,就使用 Do ... Loop While/Until 循环结构。Dim pwd As StringDo pwd = InputBox("请输入四位数字密码:")Loop While Not pwd Like "####"Debug.Print "你输入的密码是:" & pwd
这种场景使用 Do ... Loop While 结构是最自然的。首先,进入循环,要求你输入一个四位数字的密码,然后,测试你的输入。如果你的输入不符合要求,就一直循环提示你输入,直到输入满足要求为止。这个例子也可以用 Do ... Loop Until 表达如下:Dom pwd As StringDo pwd = InputBox("请输入四位数字密码:")Loop Until pwd Like "####"Debug.Print "你输入的密码是:" & pwd
注意:While 的条件是 Not pwd Like "####",而 Until 的条件是 pwd Like "####"。我们已经说过,While 的条件 W_condition 和 Until 的条件 U_condition 是互为相反的关系:- W_condition = Not U_condition
- U_condition = Not W_condition
这个例子,如果使用 Do While ... Loop 结构表达,可以是这样:Dim pwd As Stringpwd = EmptyDo While Not pwd Like "####" pwd = InputBox("请输入四位数字密码:")LoopDebug.Print "你输入的密码是:" & pwd
Do While 循环的特点是进入循环之前先测试循环条件,如果条件不满足,则跳过循环。对于我们这个例子,条件就是 Not pwd Like "####",也就是说,pwd 的值不是四位数字。如果 pwd 不是四位数字,则一直循环,提示用户输入,直到条件不满足,即 pwd 的值是四位数字的时候,结束循环。为了避免在进入循环之前因偶然原因使得 pwd 的值含有四位数字,所以在进入循环之前先对 pwd 进行初始化,赋以空字符串。这样就能确保:如果 pwd 含有四位数字,则一定是用户输入的结果。如果用 Do Until ... Loop 结构表达,则是这样:Dim pwd As Stringpwd = EmptyDo Until pwd Like "####" pwd = InputBox("请输入四位数字密码:")LoopDebug.Print "你输入的密码是:" & pwd
与 Do While ... Loop 结构的唯一不同是条件表达式:pwd Like "####"。Do Until 结构的意思是:循环直到该条件满足。因为在进入循环之前,pwd 被赋以空字符串(Empty),所以满足 pwd Like "####" 条件的 pwd 一定是用户输入的结果。从以上的“同一场景,四个循环结构”的不同写法中,我们可以得出结论:- 先测试,再循环:进入循环之前必须初始化相关的变量(如 pwd),以确保相关变量的值是通过循环获得而非偶然因素使然。
- 先循环,再测试:因为相关变量(如 pwd)是通过循环获得,因此不需要初始化。