选择结构-Switch基本概念
计算表达式的值。 并逐个与其后的常量表达式值相比较,当表达式的值与某个常量表 达式的值相等时, 即执行其后的语句,然后不再进行判断,继续执行后面所有case后的语句。如表达式的值与所有case后的常量表达式均不相同时,则执行default后的语句。
格式
switch(表达式)
{
case 常量表达式1:
语句1;
break;
case 常量表达式2:
语句2; …
break;
case 常量表达式n:
语句n;
break;
default:
语句n+1;
break;
}
Switch注意点
1.case的穿透问题
switch里面的case只要匹配一次其它的都失效,包括default. 正是因为switch的这个特性, 所以可能导致程序出现逻辑错误
为了避免上述情况,C语言还提供了一种break语句,专用于跳出switch语句,break 语句只 有关键字break,没有参数。
在每一case语句之后增加 break 语句, 使每一次执行之后均可跳出switch语句,从而避免输出不应有的结果
有时候也可用巧妙的利用case的穿透问题来简化代码
2.switch条件类型
表达式的类型(case语句后的值)必须是整型或可以转变为整型的值 (short、char和int类型)。
switch (10.10){ // 报错
case 1:
printf("12345\n");
break;
default:
printf("error\n");
break;
}
3.case值的规定
case的值必须是是整型或可以转变为整型的值
switch (10){
case 1:
printf("12345\n");
break;
case 'a': // 字符可以转换为整型
printf("12345\n");
break;
case 10.8: // 报错
printf("12345\n");
break;
default:
printf("error\n");
break;
}
case的值1、值2…值n只能为常数或常量,不能为变量。
int num = 5;
switch (10){
case num: // 变量报错
printf("12345\n");
break;
default:
printf("error\n");
break;
}
如果在case后面定义的变量必须加上大括号
switch (10){
case num:{
int num = 5;
printf("num = %d", num);
break;
}
default:
printf("error\n");
break;
}
switch中case后面的表达式的值不能相同
switch (10){
case 1:
printf("12345\n");
break;
case 1: // 和上面相同报错
printf("12345\n");
break;
default:
printf("error\n");
break;
}
case语句可以有任意多句,可以不用加括号“{}”
switch (10){
case 1:
printf("123\n");
printf("123\n");
break;
default:
printf("error\n");
break;
}
4.default的位置问题
default可以省略
switch (10){
case 1:
printf("123\n");
break;
}
default语句可以写在switch语句中的任意位置
switch (10){
default:
printf("error\n");
break;
case 1:
printf("123\n");
break;
}
执行流程:在执行的过程中,如果遇到break语句,则跳出switch语句。如果没有遇到break 语句,则一直执行到switch语句的结束。
if语句和switch语句选择
分支比较多且无法穷尽或进行大量列举 时最好用if, Switch对遇见判断非常不利
如果数据量不是很大, 并且数据是固定的可以用Switch
理论上Switch的效率比if高
循环结构概述
循环结构是程序中一种很重要的结构。其特点是,在给定条件成立时,反复执行某程序段, 直到条件不成立为止。给定的条件称为循环条件,反复执行的程序段称为循环体。
循环结构简单来说就是:循环是一次又一次的执行相同的代码块
C语言提供了多种循环语句,可以组成各种不同形式的循环结构:
goto语句和if语句构成循环;
while语句;
do-while语句;
for语句;
构成循环结构的几个条件
一般来说一个循环需要以下几部分构成:
循环控制条件:循环退出的主要依据,来控制循环到底什么时候退出
循环体:循环的过程中重复执行的代码段
能够让循环结束的语句(递增、递减、真、假等):能够让循环条件为假的依据,否则退出循环
1.while循环语法格式
while ( 条件 )
{
语句1;
语句2;
....
}
2.while循环执行流程
如果条件成立,就会执行循环体中的语句(“循环体”就是while后面大括号{}中的内 容)。然后再次判断条件,重复上述过程,直到条件不成立就结束while循环
while循环特点:
如果while中的条件一开始就不成立,那么循环体中的语句永远不会被执行
while循环注意点
while循环的陷阱
任何数值都有真假性
while (1) {//死循环
printf("123\n");
}
printf("123\n"); // 永远执行不到
当一个变量与一个常量进行== 或 != 的时候,通常把常量写在前面
int num = 3;
while (3 == num) {
printf("num = %d\n",num);
num++;
}
while 后如果只有一条语句它可以省略大括号
空语句它也是一条语句
while小阔号后面不可以直接写分号
// while省略大阔号的时候条件满足就会执行while后面的第一条语句
while (0)
printf("123\n");
printf("456\n");
- 作用域问题
while (1) {
int a = 10;
}
printf("a = %d\n", a); // 访问不到
while (0)
int a = 10; // 作用域混乱
printf("a = %d\n", a);
- 分号问题
while (1);//空语句
{
printf("123\n");
}
- 最简单的死循环
while (1);
注意点
1.while循环的陷阱
任何数值都有真假性
while (1) {//死循环
printf("123\n");
}
printf("123\n"); // 永远执行不到
当一个变量与一个常量进行== 或 != 的时候,通常把常量写在前面
int num = 3;
while (3 == num) {
printf("num = %d\n",num);
num++;
}
while 后如果只有一条语句它可以省略大括号
空语句它也是一条语句
while小阔号后面不可以直接写分号
// while省略大阔号的时候条件满足就会执行while后面的第一条语句
while (0)
printf("123\n");
printf("456\n");
作用域问题
while (1) {
int a = 10;
}
printf("a = %d\n", a); // 访问不到
while (0)
int a = 10; // 作用域混乱
printf("a = %d\n", a);
分号问题
while (1);//空语句
{
printf("123\n");
}
最简单的死循环
while (1);
1.do-while循环语法格式
do {
语句1;
语句2;
....
} while ( 条件 );
2.do-while循环执行流程
do-while语句语义:
当执行到do-while循环时,首先会执行一遍循环体中的语句(“循环体”就是do后面大括号{}中的内容)。接着判断while中的条件,如果条件成立,就执行循环体中的语句。然后再次判断条件,重复上述过程,直到条件不成立就结束while循环
while循环特点:
do-while循环的特点:不管while中的条件是否成立,循环体中的语句至少会被执行一遍
使用场景
+ 口令校验
1.for循环语法格式
C语言中的for语句使用最为灵活,不仅可以用于循环次数已经确定的情况,而且可以用于循 环次数不确定而只给出循环结束条件的情况,它完全可以代替while语句。
for(初始化表达式;循环条件表达式;循环后的操作表达式)
{
执行语句;
}
2.for循环执行流程
for循环开始时,会先执行初始化表达式,而且在整个循环过程中只执行一次初始化表达式
接着判断循环条件表达式,如果条件成立,就会执行循环体中的语句(“循环体”就是for后面大括号{}中的内容)
循环体执行完毕后,接下来会执行循环后的操作表达式,然后再次判断条件,重复上述过程,直到条件不成立就结束for循环
for循环的其他形式
表达式省略(三个表达式都可以省略)
如:for(; ;) 语句相当于while(1) 语句,即不设初值,不判断条件(认为表达式2为真值),循环 变量不增值。无终止地执行循环体。
循环控制无关的任意表达式
表达式1和表达式3可以是一个简单的表达式,也可以是逗号表达式,即包含一个以上的简单表达 式,中间用逗号间隔。
什么情况下用for
当变量只是用来控制循环的次数的时候用for更节约内存
int i = 0;
while (i < 3) {
printf("i = %d\n", i);
i++;
}
printf("循环结束后 i = %d\n", i);
什么情况下用while
当变量在循环结束后还需要使用,就用while
for (int j = 0; j < 3; j++) {
printf("j = %d\n", j);
}
printf("循环结束后 j = %d\n", j);// 不能访问j
一般情况下while和for可以互换, 但是如果循环执行完毕之后就不需要使用用于控制循环的增量, 那么用for更好
for循环的嵌套
循环语句的循环体中存在其他的循环语句就是循环嵌套,称之为循环嵌套
注意: 一般循环嵌套不超过三层
外循环执行的次数 * 内循环执行的次数就是总共执行的次数
- 格式:
while(条件表达式)
{
while((条件表达式)
{
语句;
...
}
}
for (;;)
{
for (;;)
{
for (;;)
{
for (;;)
{
}
}
}
}
for (;;)
{
while((条件表达式)
{
语句;
...
}
}
while((条件表达式)
{
for (;;)
{
语句;
...
}
}