五、C语言流程控制
1.流程控制简介
什么是流程控制
程序代码执行的顺序
流程控制的分类
- 顺序执行
- 选择执行
- 循环执行
用流程控制可以解决所有问题
2.选择
定义
有选择的执行某些代码
if语句
if最简单的用法
格式:
if (表达式)
语句
功能:如果表示式为真,执行语句
如果表达式为假,语句不执行
if的范围问题
(1)
if (1>2)
printf("aaa\n");(语句a)
printf("bbb\n");(语句b)
if 默认只能控制语句a的执行或不执行,无法控制语句b的执行或不执行。或者讲,语句b一定执行
if (1>2)
{
printf("aaa\n");(语句a)
printf("bbb\n");(语句b)
}
此时if可以控制语句a和b,由此可见if只能控制一个语句的执行或不执行,若if想控制多个语句的执行,需要用{}将语句括起来
if,else的用法
if (3 > 2)
printf("aaaa\n");
else
printf("bbbb\n");
printf("cccc\n");
同样的,else也只控制一个语句
if ,else if,else…的用法
格式
If (1)
A;
else if (2)
B;
else if(3)
C;
else
D;
C语言对真假的处理
非零是真
零就是假
真用1表示
假用0表示
if的常见问题解析
(1);(分号)是一个空语句
例如:
if (1>2);
printf("aaaa\n");
printf("bbbb\n");
在if语句后面加了一个分号,此段程序就变成了三个语句,下面两个printf语句不受if控制
(2)
If (1);
语句A
是错误的
(3)
if (表示式1)
语句A;
else if (表达式2)
语句B;
else
语句C;
当表达式1和2同时成立时,只执行语句A,因为当表达式1成立时,就没有否则了。
(4)
if (表示式1)
语句A;
else if (表达式2)
语句B;
当没有else时,语法不会出错,逻辑上有漏洞
(5)
if (表示式1)
语句A;
else if (表达式2)
语句B;
else (表达式3)
语句C;
这样写是不对的,正确的写法是:
要么去掉else后面的表达式
要在在else后面加if
(6)
else (5>10); //无实际意义的语句
printf(“AAA\n”);
等价于:
else
(5>10);
Printf(“AAA\n”);
switch语言
switch(表达式)
{
case 常量表达式1:语句1;
case 常量表达式2:语句2;
…
case 常量表达式n:语句n;
default :语句n+1;
}
所以,一般case的语句后面会加break,表示满足当前case情况,就不再向下面的case执行。
3.循环
定义
某些代码会被重复执行
for循环
第一次循环:1,2,4,3
第二次循环:2,4,3
…直到不满足循环条件2
格式
for (1;2;3)
语句A;
执行的流程(重点)
单个for循环的使用
多个for循环的嵌套使用
for(1; 2; 3) //1
for(4; 5; 6)//2
A;//3
B;//4
整体是两个语句,1,2,3是第一个语句,4是第二个语句
范围问题
for(在不加{}情况下)一次只能控制一个语句
for(1;2;3)
for(4;5;6)
A;
B;
顺序1,2,4,5,A,6,5,A,6,
当5不成立执行3,2,然后4,5,A,6。
当5不成立执行3,然后执行2,当2不成立,执行B
while
执行顺序
格式:
while(表达式)
语句;
for(1;2;3)
A;
等价于
1;
While(2)
{
A;
3;
}
与for的比较
for和while可以相互转化,但for的逻辑性更强,更不容易出错,推荐多使用for
while举例
从键盘输入一个数字,如果该数字是回文数,则返回yes,否则返回no。
回文数:正着写和倒着写都一样
比如:121,12321
什么时候使用While,什么时候使用for
没法说,用多了就知道了
do while
主要用于人机交互
格式
do
{
…
} While(表达式);
While(表达式)
{
…
}
for(1;2;3)
A;
do…while并不等价于for,当然也不等价于while
4.break和continue
break的用法
- break如果用于循环是用来终止循环
- break如果用于switch,则是用于终止switch.
- break不能直接用于if,除非if属于循环内部的一个子句
例:
for (i=0; i<3; ++i)
{
if (3>2)
break; //break虽然是if内部的语句,但break终止的是外部的for循环
printf("嘿嘿\n");//永远不会输出
}
- break用于多层循环,只能终止最里面包裹它的循环
for (i=0; i<3; ++i)
{
for (j=1; j<4; ++j)
break;//break只能终止距离它最近的循环
printf("你好\n");
}
- 在多层switch嵌套中,break只能终止距离它最近的switch
int x = 1;
int y = 0;
int a, b;
a = b =0;
switch(x) //第一个switch
{
case 1:
switch(y) //第二个switch
{
case 0:
a++;
break;//终止第二个switch
case 1:
b++;
break;
}
b=100;
break;//终止第一个switch
case 2:
a++;
b++;
break;
}
printf("a = %d, b = %d",a, b);
最终a=1,b=100
continue的用法
用于跳过本次循环余下的语句,转去判断是否需要执行下一次循环。
例1:
for (1;2;3)
{
A;
B;
Continue;//如果执行完该语句后,会执行语句3,C和D都会被跳过去,不会被执行
C;
D;
}
while(表达式)
{
A;
B;
Continue;//如果执行该语句,则执行完该语句后,会执行表达式,C和D会被跳过,不被执行。
C;
D;
}