程序的三大流程控制结构
- 什么是语句?
C语言中由一个分号 ; 隔开的就是一条语句。
1. 顺序结构
就是从上到下一条一条的执行语句,它会执行所有语句,而且只要是已经执会再次执行
2. 条件语句(分支语句if和switch)
C语言提供了if语句和Switch语句来完成根据条件判断的结果选择要执行的程序语句
根据条件判断的结果,选择所要执行的程序语句
if 语句
它根据给定的表达式的值进行判断,以决定执行某个分支程序段
基本格式
if(表达式)语句;
如果表达式的值为真(非0),则执行其后的语句;否则不执行该语句
注意:if关键字之后的表达式通常是逻辑表达式或关系表达式,也可以是其他表达式,如赋值表达式等,甚至可以是变量
if-else语句
if(表达式1)
语句1;
else(表达式2)
语句2;
多分支结构
if-else-if语句
if(表达式1)
语句1;
else if (表达式2)
语句2;
else if(表达式3)
语句3;
else
语句n;
从上到下依次判断表达式的值,当某个表达式为真是,则执行其后面的语句
if 语句的嵌套
所谓嵌套,就是在if语句后面的执行语句中又包含if语句;一般形式入下
if(表达式1)
if(表达式2)
语句1;
else(表达式3)
if(表达式3)
语句2;
Switch语句(多分支语句)
Switch(表达式)
{
case常量表达式1;
语句1;
break;
case常量表达式2;
语句2;
break;
case常量表达式3;
语句3;
break;//break语句的实际效果是把语句列表划分为不同的部分
default;
语句n;
}
编程好习惯
在最后一个 case 语句的后面加上一条 break语句。(之所以这么写是可以避免出现在以前的最后一个 case 语句后面忘了添加 break语句)。
其执行过程:
首先计算表达式的值,然后将该值与后面的各个case关键字的常量表达式相比较,当表达式的值与某个常量表达式的值相等时,即执行其后与语句,然后不再进行判断,继续执行所有case后的语句,直到遇到break语句退出Switch语句。
如果表达式的值与所有case后的表达式都不等,则执行default语句。
每个switch语句中只能出现一条default子句。
但是它可以出现在语句列表的任何位置,而且语句流会像贯穿一个case标签一样贯穿default子句
注意
1,Switch关键字后面的括号内的表达式的值必须为整型,不能为实型。
2,case关键字的常量表达式后面要添加冒号(😃
3,case 关键后面的值可以是常量,也可以是常量表达式,但表达式中不能有变量,因为case关键字后面的值必须在编译阶段被确定。
4,每个case后面的常量表达式的值要与Switch后面括号内的表达式的类型要一致,且各个case后面的常量表达式必须互不相同。
5,执行完一个case后面的语句,流程控制转移到下一个case继续执行,“case常量表达式”只起语句标号作用,并不是在该处进行条件判断。
因此,如果在执行完当前case语句后需要跳到Switch语句后执行,就需要在改case分支最后加上break语句
6,default分支可以省略,如果省略该分支,则当前常量表达式与Switch后面括号内的表达式的值不相等时,Switch结构中没有语句被执行。
7,Switch语句允许嵌套
#include <stdio.h>
int main()
int n = 1;
int m = 2;
switch (n)
{
case 1:
m++;
case 2:
n++;
case 3:
switch (n)
{//switch允许嵌套使用
case 1:
n++;
case 2:
m++;
n++;
break;
}
case 4:
m++;
break;
default:
break;
}
printf("m = %d, n = %d\n", m, n);
return 0;
}
m=5,n=3
3.循环语句
有时需要反复操作一个或几个动作,程序进行到某个位置后,又返回执行前面的语句,这种结构成为循环结构。
while
for
do while
while
如果循环体为多条语句,后面跟一个大括号才能执行多条语句,否则默认执行紧挨后面的一条语句。
while语句可用来实现入口条件循环,即当循环条件满足时执行循环体内的语句。
while 语法结构
while(表达式) //表达式结果为真,执行循环语句
循环语句;//为假,跳出循环
表达式为循环条件,语句为循环体,while语句中遇到break是用来终止整个循环
for循环
语法
for(表达式1;表达式2;表达式3)
循环语句;
表达式1:初始化变量
表达式2:条件判断部分
表达式3:调整部分
for语句中的两个分号不能省略,其他可以省略
也可将循环体写到for语句中
注意
- 不可在for 循环体内修改循环变量,防止 for 循环失去控制。
- 建议for语句的循环控制变量的取值采用“前闭后开区间”写法。
如 for(i=0;i<10;i++)
//for循环的变种
#include<>
int main ()
{
int i=0;
for(;;)
{
printf("呵呵\n");
return 0;
}
//for 循环的初始化,判断,调整三个部分是可以省略的
//判断部分如果省略,意味着判断条件恒为真
建议:不要轻易省略
//
int i=0;
int j=0;
for(;i<10;i++)
{
for(;j<10;j++)
printf("hehe\n");
}
打印10个hehe
//变种2
int x, y;
for (x = 0, y = 0; x<2 && y<5; ++x, y++)
{
printf("hehe\n");
}
return 0; }
do…while()循环
do
循环语句;
while(表达式);
#include <stdio.h>
int main()
{
int i = 10;
do
{
printf("%d\n", i);
}while(i<10);
return 0; }
do while循环中的break和continue
#include <stdio.h>
int main()
{
int i = 10;
do
{
if(5 == i)
break;
printf("%d\n", i);
}while(i<10);
return 0; }
#include <stdio.h>
int main()
{
int i = 10;
do
{
if(5 == i)
continue;
printf("%d\n", i);
}while(i<10);
return 0; }
转向语句
C语言提供出循环或短路循环的break语句和continue语句
break中断语句
Switch结构中使用break语句,用来中断分支的执行,跳到Switch语句后一条语句执行
当在循环结构中使用break语句时,可使程序终止循环而执行循环后面的语句。
#include <stdio.h>
int main()
{
int i = 0;
for(i=1; i<=10; i++)
{
if(i == 5)
break;//终止整个循环
printf("%d ",i);
}
return 0; }
注意
对于多重循环嵌套,使用break语句只能跳出当前循环,而不会跳出所有外循环。
continue条件继续语句
continue语句的作用是跳过本次循环体中剩余的语句,而直接去执行下一次循环。
#include <stdio.h>
int main()
{
int i = 0;
for(i=1; i<=10; i++)
{
if(i == 5)
continue;
printf("%d ",i);
}
return 0; }
continue语句只能在for,while,do-while等循环体中使用。
int main()
{
int i = 1;
while(i<=10)
{
i = i+1;
if(i == 5)
continue;
printf("%d ", i);
}
return 0;
}
continue在while循环中的作用就是:
continue是用于终止本次循环的,也就是本次循环中continue后边的代码不会再执行,而是直接
跳转到while语句的判断部分。进行下一次循环的入口判断
标签语句 goto
goto语句的语义是改变程序的流向,转去执行语句标号所标识的语句。
它通常与条件语句配合使用,可使用来实现条件转移,构成循环,跳出循环体等功能。
goto也称为无条件转移语句
goto 语句标号;
语句标号是按标识符规定书写的符号,放在某一语句行的前面,标号后面加冒号(:)。语句标号起标识语句作用,与goto语句配合使用。
goto语言真正适合的场景如下
for(...)
for(...)
{
for(...)
{
if(disaster)
goto error;
}
}
…
error:
if(disaster)
// 处理错误情况
如果存在深层嵌套的情况goto语句是比较合适的
在程序中定义标号时,整个程序中标号不能重名,例如
loop :if(i<=n)
label:sum+=i;
以上语句分别为两行程序定义标号,使goto语句能跳转到该行程序执行处执行。
不使用for,while,或do-while语句,只使用goto语句也可构造循环结构。
用goto语句编写循环结构代码实例。
#inclue<stdio.h>
int main()
{
int n,i,sum=0;
printf("请输入一个整数:");
scanf("%d",&n);//输入一个累加到的整数的值
i=1;
loop:if(i<=n) //条件判断i<=n,若成立,则执行下面的代码
{
sum+=i;
i++;
goto loop; //回到loop出现的位置再进行条件判断
}
printf("1到%d所有自然数之和为:%d\n",sum);
getch();
return 0;
}
loop:if(i<=n) 在第11行中定义了标号以后,在程序的任何位置都可以使用goto语句跳转到该行。
提示: 在Switch语句中,case关键字及其后面的常量就是一个标号。
返回语句 return
162页
函数调用的时候计算结果通常是通过返回值带出的,如果