一、break关键字
break适用于switch-case语句,也适用于while、for,当 break 关键字用于 while、for 循环时,会终止循环而执行整个循环语句后面的代码。break 关键字通常和 if 语句一起使用,即满足条件时便跳出循环。
但是注意:在多层循环中,一个 break 语句只向外跳一层。例如,输出一个4*4的整数矩阵:
#include <stdio.h>
int main(void)
{
int i = 1, j = 1;
while(1) //外层循环
{
j = 1;
while(1) //内层循环
{
printf("%-4d", i*j);
j++;
if(j > 4)
{
break; //跳出内层循环
}
}
printf("\n");
i++;
if(i > 4)
{
break; //跳出外层循环
}
}
return 0;
}
运行结果:
1 2 3 4
2 4 6 8
3 6 9 12
4 8 12 16
当 j>4 成立时,执行break;,跳出内层循环;外层循环依然执行,直到 i>4 成立,跳出外层循环。内层循环共执行了4次,外层循环共执行了1次。
break语句是跳出while、for,但是不能跳过它对应的for while以后的语句。
二、continue语句
continue 语句的作用是跳过循环体中剩余的语句而强制进入下一次循环。continue语句只用在 while、for 循环中,常与 if 条件语句一起使用,判断条件是否成立。
来看一个例子:
#include <stdio.h>
int main(void)
{
char c = '\0';
while( c != '\n')
{
c = getchar(); //在缓冲区获取一个字符
if(c == '4' || c == '5')
{
continue;
}
printf("%c ", c);
}
return 0;
}
结果:
0123456789
0 1 2 3 6 7 8 9
程序遇到while时,变量c的值为'\0',循环条件c!='\n'成立,开始第一次循环。getchar() 使程序暂停执行,等待用户输入,直到用户按下回车键才开始读取字符。
本例我们输入的是 0123456789,当读取到4或5时,if 的条件c=='4'||c=='5'成立,就执行 continue 语句,并跳过后面的代码,也就是不执行后面代码,直接进入下一次循环,也就是说 printf("%c ", c);不会被执行到。而读取到其他数字时,if 的条件不成立,continue 语句不会被执行到, printf("%c ", c);;就会输出读取到的字符。
break与continue的对比:break 用来结束所有循环,循环语句不再有执行的机会;continue 用来跳出本次循环,直接跳到下一次循环,如果循环条件成立,还会继续循环。
三、goto语句
goto语句也称为无条件转移语句,其一般格式如:goto 语句标号; 其中语句标号是按标识符规定书写的符号(类似写变量一样), 放在某一语句行的前面,标号后加半角冒号“:”。语句标号起标识语句的作用,与 goto 语句配合使用。
goto语句也称为无条件转移语句,其一般格式如下:
语句标号:
//语句
goto 语句标号;
或者
goto 语句标号;
语句标号:
其中语句标号是按标识符规定书写的符号,放在某一语句行的前面,标号后加半角冒号“:”。语句标号起标识语句的作用,与goto句配合使用。如:
#include <stdio.h>
int main(void)
{
int i;
//goto组成的语句相当于while(1)
loop:
printf("请输入变量i的值:");
scanf("%d", &i);
printf("你输入i的值:%d\n", i);
goto loop;
return 0;
}
运行结果:
请输入变量i的值:54
你输入i的值:54
请输入变量i的值:14
你输入i的值:14
请输入变量i的值:25
你输入i的值:25
C语言不限制程序中使用标号的次数,但各标号不得重名。goto 语句的语义是改变程序流向, 转去执行语句标号所标识的语句。
goto 语句通常与条件语句配合使用。可用来实现条件转移, 构成循环,跳出循环体等功能。
但是,在结构化程序设计中一般不主张使用 goto 语句, 以免造成程序流程的混乱,使理解和调试程序都产生困难。
关于 goto 使用语句的一些建议
goto 语句在结构化编程技术出来后,被当作破坏结构化程序的典型代表,可以说,在结构化程序设计年代,goto 语句就像洪水猛兽一样,程序员都唯恐避之不及;可后来在微软的一些例子程序中经常把 goto 语句用来处理出错,当出错时,goto 到函数要退出的一个label那里进行资源释放等操作。goto 语句也不是只可以用于出错处理,其它地方都不可以用了。下列关于使用 goto 语句的原则可以供读者参考。
- 使用 goto 语句只能 goto 到同一函数内,而不能从一个函数里goto到另外一个函数里。
- 使用 goto 语句在同一函数内进行 goto 时,goto 的起点应是函数内一段小功能的结束处,goto 的目的label处应是函数内另外一段小功能的开始处。
- 应该避免向两个方向跳转。这样最容易导致"面条代码"。