0
点赞
收藏
分享

微信扫一扫

分支和结构

1.循环辅助:continue和break

一般而言,程序进入循环后,在下一次循环测试之前会执行完循环体中的所有语句。使用continue和break语句可以根据循环体中的测试结果来忽略一部分循环内容,甚至终止整个循环。

1.1continue语句

3种循环都可以使用continue语句。执行到该语句时,会跳过本次迭代的剩余部分,并开始判断下一轮的测试条件。当continue语句在嵌套的循环中时,它只能影响所属的这层循环。

使用continue语句的好处是可以减少主语句中的一级缩进。当嵌套较多或者语句过多时,紧凑简洁的格式能够提高代码的可读性。解释一下这句话的意思,

while((ch = getchar()) != '\n'){
if(!isalpha(ch))
continue;
/*

其它处理
*/
}

如果上述代码不用continue语句,则需要将“其它处理”放入else语句中,当这部分代码过多,或者存在其它更多嵌套时,代码格式可能不美观。continue语句还可用占位符,当然使用空语句​​;​​也行,只不过使用continue更加具有可读性,当需要不做任何事情时,可以使用占位符,如跳过一些不合适的输入。

1.2break语句

当程序执行到循环中的break语句时,会终止包含break语句的那层循环。break语句可用于循环语句和switch语句中,但是continue语句只能用于循环中。当然,continue语句可以在循环中作为switch语句一部分,以跳过剩余的循环部分,自然也包括switch语句的剩余部分。

while(scanf("%d", &num) == 1){
while(num > 0){
sum += num;
if(num-- <= 0)
break; //跳出num>0这层循环
}
if(sum > 10000)
break; //跳出外层循环
}

2.多重选择switch语句

使用条件运算符或if else语句很容易编写二选一的程序。然而,有时程序需要在多个选项中进行选择,也可以用if{}else if{}else来完成,相比之下,大多数情况使用switch语句更方便,但是if{}else if{}else使用更为广泛,因为switch语句的case标签要求严格,只能是整型常量或整型常量表达式。

switch的构造如下:

switch(整型表达式)
{
case 常量1: //不能用变量,也不能是一个范围
语句; //可选
case 常量2:
语句; //可选
……
case 常量n:
语句; //可选
//default语句可选
default: //如果上述的case都没有匹配成功,则运行有default语句
语句; //可选
}

switch在圆括号中的整型表达式,即值是一个整数值的表达式,case标签必须是整数类型(包括char类型,实际char的实现也是整型)的常量或整型常量表达式,即表达式中只包含整型常量。

上面提过break语句能用于switch语句,当执行break语句时,将跳过剩余的case标签。如果没有break语句,就会从匹配标签开始执行到switch末尾。利用这个特性,可以在switch语句中使用多重标签。

while((ch != getchar()) != '\n'){
switch(ch)
{
case 'a':
case 'A': a_count++;
break;

……
}
}

如果字母是b,switch语句会定位到标签为case 'b':的位置,但由于该标签并没有进行操作,所以程序直接执行下一条语句b_count++;。所以在本质上,两个标签都指的是相同的语句,即b_count++;,然后执行break语句跳出switch语句。

3.goto语句

首先,不建议使用goto语句,胡乱跳至程序的不同部分,会导致程序混乱。goto语句有两部分:goto和标签名,goto语句使程序控制跳转至相应标签语句,goto语句的格式如下:

goto biaoqian;
……
biaoqian: printf("Don't use goto.");

冒号用于分隔标签和标签语句。实际上,break和continue是goto的特殊形式,使用break和continue的好处是,这些语句不使用标签,所以不用担心把标签放错位置导致的危险。C程序员唯一可以接受一种goto的用法是,当出现问题时从一组嵌套循环中跳出,因为一条break语句只能跳出一层循环。

跳转语句:break语句、continue语句、goto语句和return语句。

举报

相关推荐

0 条评论