一. break语句
1.1 适用范围:
只能用于循环(while, for, do while)和switch语句中。
1.2 作用:
1.2.1 在循环中的作用:
直接终止当前循环,不再进行后续迭代;但在嵌套循环中,break仅终止最近一层的循环
1.2.2 在switch语句中的作用:
防止“case穿透”(即执行完一个case后继续执行下一个case)
1.3 while循环中的break
1.3.1 代码演示
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
int i = 0;
while (i < 10)
{
if (i == 5)
break;
printf("%d ",i);
i++;
}
return 0;
}
1.3.2 代码分析
程序从main函数进去之后,先创建一个变量i并初始化为0,接着来到while循环语句这里,进行条件判断,看i是否满足条件(如果满足条件就进入while循环里面,执行循环体;如果不满足条件,就不进入循环体里面,直接到 return 0;结束程序的运行),当然我们这里 (i==0;)小于10,满足判断条件,进去了while循环里面,接着又判断i是否会等于5(等于5则执行break,跳出循环,结束程序运行;不等于5则不必理会该语句,跳过它,执行printf语句,再执行i++语句),当然我们这i==0;不执行if语句,直接执行printf 语句,再执行i++语句。这时屏幕上会打印0,i也由0自增成了1;然后代码又跳到while(i<10)这里进行条件判断,(i==1)<10,满足条件,进入while循环里面,(i==1)!=5,跳过if语句,执行printf语句,屏幕上打印1,再执行i++语句,i变成2。以此类推,时当i自增到5,(i==5)<10,满足条件进入while循环,这时满足if语句的条件,会进入if语句里面执行break;语句,执行break;语句直接会跳出while循环,来到return 0;这里结束程序的运行。所以屏幕上会打印 0 1 2 3 4
1.4 for循环中的break
1.4.1 代码演示
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
int i = 0;
for (i = 0; i <= 10; i++)
{
if (i == 5)
break;
printf("%d ", i);
}
return 0;
}
1.4.2 代码分析
参照1.3.2代码分析,执行逻辑一样。
1.5 do while 循环中的break
1.5.1 代码演示
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
int i = 0;
do
{
if (i == 5)
break;
printf("%d ", i);
i++;
} while (i < 10);
return 0;
}
1.5.2 代码分析
程序从main函数进去之后,先创建一个变量i并初始化为0,接着来到do语句这里,直接进去do语句里面,然后判断i是否会等于5(等于5则执行break,跳出循环,结束程序运行;不等于5则不必理会该语句,跳过它,执行printf语句,再执行i++语句),当然我们这i==0;不执行if语句,直接执行printf 语句,再执行i++语句。这时屏幕上会打印0,i也由0自增成了1;,然后来到while(i <10);这里,这时(i==1)<10,满足条件,又进去do语句里面,这时(i==1)不满足if语句的条件,直接跳过,去执行printf语句,屏幕上会打印1,再去执行i++语句,i变成了2。以此类推,当i自增到(i==5)时,(i==5)<10,满足条件,再一次进入do 语句,这时(i ==5)满足if语句的条件,代码进入if语句里面,执行break;语句,跳出 do while循环,来到return 0;这里,程序结束运行,屏幕上会打印 0 1 2 3 4
1.6嵌套循环中的break
1.6.1 代码演示
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
int i = 0;
for (i = 1; i < 5; i++)
{
int j = 0;
for (j = 1; j < 5; j++)
{
if (j == 3)
{
break;
}
printf("i=%d\n", i);
printf("j=%d\n", j);
}
}
return 0;
}
1.6.2 代码分析
程序从main函数进去之后,先创建一个变量i,并将其初始化为0。来到for循环这,这时i被赋值为1,小于5,满足循环条件,进入第一个for循环内部,创建一个变量j,并将其初始化为0,来到第二个for循环这,j被赋值为1,小于5,满足循环条件,进入第二个for循环内部,j这时为1,不满足if表达式的条件,直接来到printf这,打印i=1 j=1。完成之后,j自增为2,又来到第二个for循环这,2<5,进入循环,不满足if表达式,直接来到printf这,打印i=1 j=2。完成之后,j自增为3,又来到第二个for循环这,2<5,进入循环,满足if表达式,执行break语句,跳出第二个for循环。来到第一个for循环这,i自增为2,2<5,进入循环内部,又创建一个变量j,并将其初始化为0,,来到第二个for循环这,j被赋值为1,小于5,满足循环条件,进入第二个for循环内部,j这时为1,不满足if表达式的条件,直接来到printf这,打印i=2 j=1。完成之后,j自增为2,又来到第二个for循环这,2<5,进入循环,不满足if表达式,直接来到printf这,打印i=2 j=2。完成之后,j自增为3,又来到第二个for循环这,2<5,进入循环,满足if表达式,执行break语句,跳出第二个for循环,来到第一个for循环这,i自增为3。以此类推,最终打印的结果如上图所示。
1.7 switch 语句里面的break
1.7.1 代码演示(基础版)
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
int day = 0;
while (scanf("%d", &day) != -1)
{
switch (day)
{
case 1:
printf("工作日\n");
break;
case 2:
printf("工作日\n");
break;
case 3:
printf("工作日\n");
break;
case 4:
printf("工作日\n");
break;
case 5:
printf("工作日\n");
break;
case 6:
printf("休息日\n");
break;
case 7:
printf("休息日\n");
break;
default:
printf("输入的信息有误,请从新输入:\n");
break;
}
}
return 0;
}
1.7.2 代码演示(进阶版)
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
int day = 0;
while (scanf("%d", &day) != -1)
{
switch (day)
{
case 1:
case 2:
case 3:
case 4:
case 5:
printf("工作日\n");
break;
case 6:
case 7:
printf("休息日\n");
break;
default:
printf("输入的信息有误,请从新输入:\n");
break;
}
}
return 0;
}
1.7.3 代码分析
程序从main函数进入以后,先创建一个变量day,并将其初始化为0;来到while循环,使用scanf读取用户输入,尝试将输入解析为整数并存入day,这时如果输入成功,scanf 返回1,循环继续,如果输入失败或遇到文件结束符,scanf返回-1,循环终止;读取成功时,进入循环内部,来到switch分支判断,根据不同的day选择不同的分支;(case 1-5:输出 工作日\n, break跳出switch。)(case 6-7:输出 休息日\n, break跳出switch。)输入不符合的数字会进入default语句,屏幕上会打印输入的信息有误,请重新输入:,每次break结束后,回到while循环开头,继续等待输入;当用户触发EOF或输入错误时,循环结束,执行return 0,退出程序。
注:用户输入的数据只能为数字,如果是非数字,scanf无法解析,返回值为0,不等于-1,也符合循环的条件,将进入循环体里面,但是因为输入的是非数字,day的值未被改变,还是上一个day的值,输出的还是上一个day所反应的信息,然后又再一次来到while循环这里,因为缓存区里的无效数据未被清除,保留了上一个非数字,scanf无法解析,返回值为0,不等于-1,也符合循环条件,一直循环往复,导致陷入死循环。
二.continue语句
2.1适用范围:
循环内部(while , for , do while )
2.2 作用:
while循环:continue 跳过本次循环中continue后面的代码,直接进入下一次循环条件判断部分
for循环:使程序跳过当前迭代中continue之后的部分,直接进行下一次迭代。
do while 循环:跳过本次循环中continue之后的代码,回到循环条件判断出。
2.3 while循环中的continue
2.3.1 代码演示(打印1~50之间5的倍数的数字)
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
int i = 0;
while (i < 50)
{
i++;
if (i % 5)
continue;
printf("%d ", i);
}
return 0;
}
2.3.2 代码分析
程序从main函数进去,先创建一个变量i,并将其初始化为0,来到while循环这,进行条件判断,因为0<50,进入循环内部,i自增为1,因为(1%5==1)为非0,表达式为真,进入 if语句,执行continue语句,跳过continue语句后面的代码,直接来到循环条件判断部分,因为1<50,进入循环内部,i自增为2,因为(2%5==2)为非0,表达式为真,进入if语句,执行continue语句,跳过continue语句后面的代码,直接来到循环条件判断部分。以此类推,当i自增为5,10,15,20,25,30,35,40,45,50的时候(i%5==0)不再满足if语句,也不再进入if语句,不执行continue语句,执行printf语句,屏幕上将打印5,10,15,20,25,30,35,40,45,50这些数字。
2.4 for循环中的continue
2.4.1 代码演示
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
int i = 0;
for (i = 1; i < 50; i++)
{
if (i % 5)
continue;
printf("%d ", i);
}
return 0;
}
2.4.2 代码分析 程序从main函数进入以后 , 先创建一个变量i,并将其初始化为0,来到for循环这,将i赋值为1,小于50,进入for循环内部,因为(1%5==1)为非0,满足if语句判断条件,执行continue语句,跳过continue语句后的代码,直接来到变量调整部分(i++),i变成2。以此类推,当i的值为5,10,15,20,25,30,35,40,45 时if语句不再执行,直接执行printf语句,屏幕上会打印 5,10,15,20,25,30,35,40,45 。
2.5 do while 循环中的continue
2.5.1 代码演示
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
int i = 0;
do
{
i++;
if (i % 5)
continue;
printf("%d ", i);
} while (i < 50);
return 0;
}
2.5.2 代码分析
程序从main函数进入以后 , 先创建一个变量i,并将其初始化为0,然后直接进入do while循环内部,i自增为1,因为(1%5==1)为非0,满足if语句,执行continue语句,跳过continue后面的代码,直接来到循环条件判断处,因为 (1<50) 进入循环内部,i自增为2,因为(2%5==2)为非0,满足if语句,执行continue语句, 跳过continue后面的代码,直接来到循环条件判断处,因为 (2<50),进入循环内部。以此类推,i的值为5 ,10 ,15 ,20 ,25 ,30 ,35 ,40 ,45 ,50,不满足if语句,直接执行printf语句,屏幕上会打印 5 ,10 ,15 ,20 ,25 ,30 ,35 ,40 ,45 ,50。
2.6 continue 执行的差别
在while循环中,当i自增到49时,执行continue语句后,来到循环条件判断处,因为(49<50)进入循环内部,i由49自增到50,不满足if语句的执行条件,不会执行continue语句,执行printf语句,屏幕上会打印50;在for循环中, 当i自增到49时,执行continue语句后,来到变量调整部分,i由49自增到50,因为(50<50)显然不成立,不在进入for循环内部,直接来到return 0这里,结束程序的运行,最后屏幕上打印的数字为45;在do while 循环中,当i自增到49时,执行continue语句后,来到循环条件判断处,因为(49<50)进入循环内部,i由49自增到50,不满足if语句的执行条件,不会执行continue语句,执行printf语句,屏幕上会打印50。