3.4 循环语句
计算机最大的特点是什么?就是可以根据一定的条件自动完成工作,而且快速、高效、不会犯错(除非代码有问题)。
循环语句就是能够根据一定的条件重复执行一系列任务的语句结构。在Objective-C中,常用的循环语句包括for、while和do-while。此外,在循环语句中,还可以使用break和continue等语句来控制循环语句的执行,下面详细讨论。
■3.4.1 for语句结构
for语句的应用格式如下:
for (<表达式1>; <表达式2>; <表达式3>) { <语句块> }
其中:
❑ <表达式1>用于定义循环控制变量。
❑ <表达式2>指定循环执行的条件,条件成立时(YES)执行循环操作,条件不成立时(NO)终止循环。
❑ <表达式3>指定循环控制变量每次循环后的变化。
❑ <语句块>定义每次循环所执行的代码。
如下面的代码,一号雷达将按顺序扫描1到10号区域。
for (int i=1; i <= 10; i++) { NSLog(@"一号雷达扫描%i号区域", i); }
下面的代码是一个简单的数学问题,我们将计算1到100的和。
int sum = 0; for (int i=1; i <= 100; i++) { sum += i; } NSLog(@"1到100的和是%i", sum);
如果是计算1到100中偶数的和,可以修改for语句中的控制语句,如下面的代码。
for (int i=2; i <= 100; i+=2)
■3.4.2 while语句结构
while语句的应用格式如下。
while (<条件>) { <语句块> }
其中,当<条件>为真(YES)时,就会执行<语句块>;当<条件>为假(NO)时终止循环结构。
下面的例子,一号雷达会不停地工作,大家不要急着在Xcode中运行,因为这个代码不会停下来,直到程序挂掉。这种循环结构称为无限循环或死循环。
while (YES) { for (int i=1; i <= 10; i++) { NSLog(@"一号雷达扫描%i号区域", i); } }
雷达的工作是比较特殊的,需要不停地扫描指定区域,但在while语句结构中,则应该有一个合理的条件,以便循环能够适时结束。如下面的代码,我们使用while语句完成1到100的累加工作。
int i = 1; int sum = 0; while (i <= 100) { sum += i; i++; } NSLog(@"1到100的和是%i", sum);
■3.4.3 do-while语句结构
do-while语句与while语句的使用比较相似,所不同的是,do-while语句结构会在每次循环结束后进行条件的判断,其基本应用格式如下。
do { <语句块> }while (<条件>);
使用do-while语句结构时应注意,<语句块>最少会执行一次,而这也是可能出问题的地方,如果在<语句块>中存在不满足条件的代码,就有可能产生错误,所以,如果有可能,我们更建议使用while语句结构,毕竟随便就让程序挂掉,并不是一个好的选择。
■3.4.4 break语句
循环语句的确可以简化很多工作,但是,我们也需要适时地终止循环操作;在Objective-C中,break语句就可以在循环结构中紧急刹车,从而终止整个循环的执行。如下面的代码,如果一号雷达发现可疑目标,就会显示信息,并锁定当前区域。
int lockedZone = 0; for (int i=1; i <= 10; i++) { // 可疑情况的出现很随机 if (arc4random() % 2 == 1) { NSLog(@"警告:一号雷达在%i号区域发现可疑目标", i); lockedZone = i; break; } }
代码中,arc4random()函数的功能是产生一个随机整数,我们取这个随机数除以2的余数,余数为1时发现目标,并终止for循环的执行。
在while或do-while语句结构中,break语句同样可以终止循环。此外,别忘了break语句在switch语句结构中的功能也是终止。
■3.4.5 continue语句
continue语句的功能是中止当前循环,并开始下一次循环(如果条件满足)。前面,一号雷达已经锁定lockedZone变量所指的区域,此时,二号雷达将代替一号雷达继续搜索其他区域,要知道,最先出现的目标很可能只是诱饵。
下面的代码,我们接着前面的示例写。
for (int i=1; i <= 10; i++) { if (lockedZone == i) continue; NSLog(@"二号雷达正在搜索%i号区域", i); }
执行此代码,我们可以看到,二号雷达在到达lockedZone区域时不会执行扫描工作,因为一号雷达已经锁定此区域,此时,使用continue语句终止此次循环,并继续下一循环。