C程序的流程控制
文章目录
一、C程序的结构化
C程序是以顺序结构,分支结构,循环结构三种基本结构构建的,单入口单出口
二、C程序的三种基本结构
1.顺序结构
顺序结构: CPU从上到下依次执行
2.分支结构
1.分支结构功能:实现多选一
2.分支结构分两类:条件分支,开关分支
a.条件分支
条件分支语法格式:
格式A:
if(表达式A){
语句1;
}
如果表达式A为真,那么就执行语句1;
格式B:
if(表达式A){
语句1;
}else{
语句2;
}
如果表达式A为真,那么就执行语句1;否则执行语句2;
格式C
if(表达式A){
语句1;
}else if(表达式B){
语句2;
}
....
else if(表达式N){
语句N;
}
如果表达式A为真,那么就执行语句1;如果表达式A不为真,那么执行表达式B;如果表达式B为真,那么就执行语句2;如果表达式B不为真,那么就依次向下判断
格式D:
if(表达式A){
语句1;
}else if(表达式B){
语句2;
}
...
else if(表达式N){
语句N;
}else{
语句M;
}
如果表达式A为真,那么就执行语句1;如果表达式A不为真,那么就执行表达式B,如果表达式B为真,那么就执行语句2;如果表达式B不为真,那么就依次向下判断,如果上面表达式都不成立那么就执行语句M。
例如
#include <stdio.h>
#include <string.h>
int main(void){
//定义并初始化字符串
char str1[]="hello";
char str2[]="china";
int len=0;
//形式A:if
if(strlen(str1)){
printf("str1的有效长度:%d\n",strlen(str1));
}
//形式B:if...else
len=strlen(str2);
if(0 == len){
printf("str2为空字符串\n");
}else{
printf("str2字符串有效长度:%d\n",len);
}
//形式C:if...else if
len = compare(str1,str2);
if(len > 0){
printf("str1大于str2\n");
}else if(0 == len){
printf("str1等于str2\n");
}else if(len < 0){
printf("str1小于str2\n");
}
//形式D:if...else if...esle
if(str1[0] != (*(str2+0)){
str1[0] = (*(str2+0));
}else if(str1[1] != (*(str1+1))){
str1[1] = (*(str2+1));
}else if(str1[2] != (*(str2+2))){
str1[2] = (*(str2+2));
}else if(str1[3] != (*(str2+3))){
str1[3] = (*(str2+3));
}else if(str1[4] != (*(str2+4))){
str1[4] = (*(str2+3));
}else{
printf("%s %s\n",str1,str2);
}
return 0;
}
//定义字符串比较函数
int compare(char *pstr1,char *pstr2){
while(*pstr1){
if(*pstr1 != *pstr2){
return *pstr1 - *pstr2;
}
pstr1++;
pstr2++;
}
return *pstr1 - *pstr2;
}
条件分支使用注意事项
1.if和else的配对原则:else或者else if和最近的if配对
2.如果语句只有一条{}是可以省略的
b.开关分支
开关分支语法结构:
switch(控制表达式){
case 常表达式1:
语句1;
break;
case 常量表达式2:
语句2;
break;
...
case 常量表达式N:
语句N
break;
default:
语句M;
break; //可以省略
}
控制表达式的计算结果和case对应的常量表达式数值相等,那么就会执行对应的语句,一旦遇到break,switch…case开关分支立刻结束,如果控制表达式和case对应的常量表达式都不相等,那么就会执行default对应的语句。
例如
#include <stdio.h>
int main(void){
//100~90 A
//89~80 B
//79~70 C
//69~60 D
//其他 E
int a=0;
printf("请输入你的成绩:");
scanf("%d",&a);
if(a < 0 && a > 100){
printf("成绩不合法\n");
return -1;
}
switch(a/10){
case 10:
case 9:
printf("成绩为A等\n");
break;
case 8:
printf("成绩为B等\n");
break;
case 7:
printf("成绩为C等\n");
break;
case 6:
printf("成绩为D等\n");
break;
default:
printf("成绩为E等\n");
}
return 0;
}
开关分支使用注意事项:
1.控制表达式被当成一个整数处理(int),可以是字符,但是不能是浮点数和字符串
2.常量表达式必须是常量,不允许有重复的分支case
3.如果其中某个case对应的break没有添加,那么当这个case成立后,并且执行其对应的语句后会继续执行下一个case
4.default关键字可以写在任意case前但是必须添加break
5.分支语句case:或者default如果定义变量记得添加{},并且将来只能在对应的case使用
6.gcc编译器对开关分支switch…case生成的代码要比条件分支if…else少,所以switch…case代码执行效率高
2.循环结构
循环结构的功能:将一组语句重复多次执行
三种类型循环:for循环,while循环,do…while循环
1.for循环
for循环的语法格式:
for(表达式A,表达式B,表达式C){
循环语句;
}
for循环语句的执行流程:
步骤一:首先计算运行表达式A(只运行一次)
步骤二:然后计算运行表达式B,
如果表达式B的结果为真时,那么运行循环语句;
如果表达式B的结果为假时,那么for循环结束退出;
步骤三:如果表达式B为真,那么就运行循环语句,并且当循环语句运行完毕
再接着计算运行表达式C,表达式C运行完毕,接着步骤二直到表达式B为假时
例如
#include <stdio.h>
#include <string.h>
int main(void){
char a[]="hello,world";
char b[]="hello,china";
//形式1
for(int i=0;i < strlen(b);i++){
if(*(a+i) != *(b+i)){
*(a+i) = *(b+i);
}
}
//打印输出字符串
printf("a=%s b=%s\n",a,b);
//形式2
//for循环的的死循环
for(;;){
printf("%s\n",b);
}
//形式3
int i=0;
for(;i<10;i++){
printf("%d\n",i);
}
//形式4
for(int i=0;;i++){
if(i >= 10){
break;
}
printf("%s\n",b);
}
//形式5
for(int i=0;i <10;){
if( 0 == (i%2)){
continue;
}
printf("%d\n",i);
}
return 0;
}
while循环
while循环语法格式:
while(循环控制表达式){
循环语句;
}
while循环语句执行流程:
步骤一:首先执行循环控制表达式
如果循环控制表达式为真,那么就执行循环语句
如果循环控制表达式为假,while循环直接结束
步骤二:当循环语句执行完毕,继续执行第一步骤如果while循环语句只有一条{}可以省略
例如
#include <stdio.h>
int main(void){
int number=0;
int sum=0;
while(number++ <= 100){
sum += number;
}
printf("%d\n");
return 0;
}
do…while循环
do…while循环语法格式:
do{
循环语句;
}while(循环控制表达式);
do…while循环语句执行流程:
步骤一:先执行循环语句
步骤二:然后计算执行循环控制表达式
如果为真,继续执行循环语句,后续依次重复
如果为假,do…while循环结束
do…while循环语句特点:至少执行一次
切记while()后的分号不可省略
例如
#include <stdio.h>
int main(void){
char a[5]={'A','B','D','E','F'};
int len=sizeof(a)/sizeof(a[0]);
int b=0;
do{
printf("%d\n",*(a+b));
b++;
}while(b < len); //此分号不可省略
return 0;
}
goto语句
goto语句语法格式:
goto 标签;
可以让cpu跳转到任何一条语句去执行,标签名就是指定要跳转的地方
标签名根据标识符命名规则来定
例如
#include <stdio.h>
typedef enum{
LABEL_FREE_ONE,
LABEL_FREE_TOW,
LABEL_FREE_THREE
}label_t;
int main(void){
//形式1:
int a[5]={1,2,3,4,5};
int len=sizeof(a)/sizeof(a[0]);
int i=0;
lab:
printf("%d\n",a[i]);//打印输出数组的第i个元素
i++;
if(i <len){
goto lab;
}
//形式2
int number=0;
scanf("%d",&number); //输入非0表示分配失败
//输入0表示分配成功
printf("分配第一块内存:");
if(0 != number){
printf("分配失败\n");
goto LABEL_ONE;
}
printf("分配第二块内存\n");
if(0 != number){
printf("分配失败\n");
goto LABEL_TOW;
}
printf("分配第三块内存\n");
if(0 != number){
printf("分配失败\n");
goto LABEL_THREE;
}
printf("三块内存分配成功\n");
return 0;
LABEL_FREE_THREE:
printf("释放第二块内存\n");
LABEL_FREE_TOW:
printf("释放第一块内存\n");
LABEL_FREE_ONE:
printf("释放完成,程序结束\n");
return number;
}
空语句
空语句使用语法:
;
仅仅包含一个;语句
应用场景:
用于实现一个空循环,延时
延时的时间不明确
例如
#include <stdio.h>
int main(void){
for(;;);
for(int 1=0;i <10000;i++);
while(1);
;
return 0;
}
切记:在while/for循环中的圆括号误写了;,意外的变成了空循环
例如
#include <stdio.h>
int main(void){
//园括号后误写上;导致循环语句成为空语句
for(int i=0;i<10;i++);{
//报错,未定义,如果循环变量定义在循环体内,循环变量只能用于该循环
printf("%d\n",i);
}
return 0;
}