一、控制流语句
控制流语句:分支控制流、选择控制流、循环控制流
- 分支控制流:
- 单道型:if(表达式){语句;}
- 分支型:if(表达式){语句1;}else{语句2;}
- 多分支型:if(表达式1){语句1;}else if(表达式2){语句2;}else{语句3;}
- 注:else 会与最近的 if 语句 组合。
- 选择控制流:
- 常用格式:
- switch(常量表达式)
- {
- case 常量1:
- 语句1;break;
- case 常量2:
- 语句2;break;
- ........
- default :
- 语句n;break;
- }
- 注意:case 后若不跟break,则会接着往下执行接下来的语句。(这是一个特点!)
- 循环控制流:
- 常用格式:
- while(表达式){语句;}
- do{语句;}while(表达式),先执行一次语句,再去判断表达式
- for(表达式1;表达式2;表达式3){语句;}
- int i =0;
- for(i=0;i<100;i++)
- {
- 语句;
- }
- 注:当使用在自加(++)、自减(--)时,处于 位置的不同(表达式 或者 语句中),循环的次数也不同!!!
- 看下面例子。
- 若 ++a 放在表达式中,由于先自加,再使用的原因,循环次数将会少1次,而a++ 则与在语句内的循环次数相同
- 若是a++ 或者 ++a 放在语句中,则循环次数相同
- 例1:
- case 后面写了break 与 未写break 的区别。
#include<stdio.h>
void main()
{
int a = 10 ;
switch(a)
{
case 10:
{
printf("a equal 10\n" );
break;
}
case 20:
{
printf("a equal 20\n" );
break;
}
case 30:
{
printf("a equal 30\n" );
break;
}
}
}
加入break后,输出结果如图所示:
未加break,输出结果如图所示:
- 例2:
- 利用switch的特性不加break,连续输出余下语句的特性!
- 实现涌入输入年月,输出剩下的天数,考虑闰年 和 平年
- 如:输入2018-11,输出2018剩下61天。
#include<stdio.h>
/*
实现用户输入年月, 输出剩下日期,考虑闰年 和 平年
如
输入: 2018-11
输出:2018年剩下61天。
*/
void main(int argc, char const *argv[])
{
char f;
int years, months, days;
while(1)
{
printf("输入格式,如:2018-9\n");
printf("请输入年月:\n");
int ret = scanf("%d %c %d", &years, &f, &months);
if(ret == 3 && f == '-')
{
break;
}
else
{
printf("输入错误,请重新输入!\n");
while(getchar() != '\n');
}
}
//闰年:能被4整除,不能被100整除,能被400整除
if(( (years%4 == 0) && (years%100 != 0) )|| (years%400 == 0))
{
switch(months)
{
case 1:
days +=31;
case 2:
days +=29;
case 3:
days +=31;
case 4:
days +=30;
case 5:
days +=31;
case 6:
days +=30;
case 7:
days +=31;
case 8:
days +=31;
case 9:
days +=30;
case 10:
days +=31;
case 11:
days +=30;
case 12:
days +=31;
}
}
else //平年
{
switch(months)
{
case 1:
days +=31;
case 2:
days +=28;
case 3:
days +=31;
case 4:
days +=30;
case 5:
days +=31;
case 6:
days +=30;
case 7:
days +=31;
case 8:
days +=31;
case 9:
days +=30;
case 10:
days +=31;
case 11:
days +=30;
case 12:
days +=31;
}
}
printf("%d 年还剩下 %d天!\n",years,days);
}
输出结果,如图所示:
- 例3:
- 自加、自减处于 循环中的位置不同(表达式 或者 语句中),循环次数也不同
#include<stdio.h>
void main()
{
int a = 1, n = 0;
//while
while(a++<10)
{
n++;
}
printf("while(a++<10) = %d\n", a);
printf("循环了%d 次\n", n);
a = 1, n = 0;
while(++a<10)
{
n++;
}
printf("while(++a<10) = %d\n", a);
printf("循环了%d 次\n", n);
a = 1, n = 0;
while(a<10)
{
a++;
n++;
}
printf("while(a<10)a++ = %d\n", a);
printf("循环了%d 次\n", n);
a = 1, n = 0;
while(a<10)
{
++a;
n++;
}
printf("while(a<10)++a = %d\n", a);
printf("循环了%d 次\n", n);
}
输出结果如图所示:
二、break 与 continue 的一些注意事项
- break:
- 只能在循环语句 或者 switch 中使用
- 跳出与break最近的循环体
- continue:
- 只能在循环语句中使用
- 跳出本次循环,进入到下一次循环中