——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-
流程控制的三种结构
C语言中的流程控制有三种结构。
第一种是顺序结构,默认的流程结构,按照书写顺序执行每一条语句。
第二种是选择结构,对给定的条件进行判断,再根据判断结果决定执行哪一段代码。
第三种是循环结构,在给定条件成立的情况下,反复执行某一段代码。
选择结构(if)
选择结构(if)有四种写法:
一、
第一种结构:
if(条件)
{
语句1;
语句2;
····
}
如果条件为真,就执行后面的语句,否则不执行。
示例1:
#include <stdio.h>
int main()
{
int mathscore = 89;
if (mathscore >= 80)
{
printf("math = %d,数学成绩优秀\n", mathscore);
}
return 0;
}
示例1的运行结果为:math = 89,数学成绩优秀
二、
第二种结构:
if(条件)
{
语句1;
}
else
{
语句2;
}
如果条件成立就执行语句1,否则执行语句2。
示例2:
#include <stdio.h>
int main()
{
int mathscore = 59;
if (mathscore >= 60)
{
printf("math = %d,数学成绩及格\n", mathscore);
}
else
{
printf("math = %d,数学成绩不及格\n", mathscore);
}
return 0;
}
示例2的运行结果是:math = 59,数学成绩不及格
三、
第三种结构:
if(条件1)
{
语句1;
}
else if(条件2)
{
语句2;
}
····
else
{
语句n;
}
示例3:
#include <stdio.h>
int main()
{
int mathscore = 75;
if(mathscore >= 80)
{
printf("math = %d,数学成绩优秀\n", mathscore);
}
else if(mathscore >= 60)
{
printf("math = %d,数学成绩及格\n", mathscore);
}
else
{
printf("math = %d,数学成绩不及格\n",mathscore);
}
return 0;
}
示例3的结果运行结果是:math = 75,数学成绩及格
四、
第四种结构:
if (条件)
语句1;
语句2;
如果条件成立就执行语句1,语句2不属于此条件结构。
示例4:
#include <stdio.h>
int main()
{
int mathscore = 85;
if(mathscore >= 60)
printf("math = %d,数学成绩及格\n", mathscore);
return 0;
}
示例4的运行结果是:math = 85,数学成绩及格
五、
if使用注意:
1. 比较大小时,可以把常量值放在左边,变量值放在右边以避免错误。因为if(a==0)也容易被写成if(a=0),而这种情况,编译器并不会报错,推荐使用if(0==a)这种写法。
2. 注意赋值运算符,不要把=写成是==。
3. if(条件)后面不要加分号,这代表是一个空语句,后面的代码块将成为一个独立的代码块。比如,if(条件);{…..}。if(条件)跟的是空语句,后面的这个代码块会变成独立的代码块,与if(条件)无关。
4. 注意作用域的问题,如果要在if后面定义新的变量,则一定要使用大括号。
示例5:
if(10>6)
{
int a;//a的作用域在代码块结束后失效
}
printf(“a=%d”,a);//编译器报错,找不到标识符a
if(10>6)
int a; //这种情况下报错,a的作用域不明确
printf(“a=%d”,a); //编译器报错,找不到标识符a
示例5展示了作用域不明的问题。
5. 随便挑一个数值也可以做条件。
示例6:
#include <stdio.h>
int main()
{
if(0)
{
printf("假\n");
}
else
{
printf("真\n");
}
return 0;
}
示例6的运行结果是:真
选择结构(switch)
一、
switch结构:
switch的用法:
Switch(值) //通常是变量
{
Case 数值1:
语句1;
Break;
Case 数值2:
语句2;
Break;
Case 数值3:
语句3;
Break;
default :
语句4;
Break;
}
该结构把条件语句中的值与数值1进行比较,若相等,则执行后面的所有语句,直到遇见break语句跳出整个switch结构,若前面的条件都不满足,则最终会执行default后面的语句。如果不写break语句,则后面的语句会接连执行,直到遇到break语句或者是全部语句执行完毕,这种情况我们称之为穿透。
示例7:
#include <stdio.h>
int main()
{
int date = 5;
switch (date)
{
case 1:
printf("today is monday\n");
break;
case 2:
printf("today is tuesday\n");
break;
case 3:
printf("today is wednesday\n");
break;
case 4:
printf("today is thursday\n");
break;
case 5:
printf("today is friday\n");
break;
case 6:
printf("today is saturday\n");
break;
case 7:
printf("today is sunday\n");
break;
default:
break;
}
return 0;
}
示例7的运行结果是:today is friday
二、
switch结构的使用注意:
Char c=‘A’;
Switch(c)
{
Case ‘A’:
语句1;
Break;
Case 65://不能这样写,因为‘A’的ASCII值就是65,两条case语句一样会报错
语句2;
Break;
Case 数值3:
int a=10;/*a的作用域不明确报错,如果要在case语句后面定义新的变量则要加{}*/
Break;
Default :
语句4;
Break;
}
如果要在case后面的语句中定义变量,则必须使用大括号包住。
三、
if与switch对比:
1. if语句能够完成的功能,switch有时并不能够完成,比如,判断if(a>100)。
2. 在有些情况下,if语句和switch语句可以互换。
3. switch语句能完成的功能,if语句都可以完成。
循环结构(do-while)
do-while循环结构至少会被执行一次,在while后面的条件成立的情况下,括号里面的语句会不断的循环执行,什么时候条件不成立了什么时候循环结束。
do-while循环结构:
do
{
语句
}while(条件)
示例8:
#include <stdio.h>
int main()
{
int a = 1;
do
{
a++;//a自增一次
}while(a<1);//条件不成立循环结束
printf("a = %d\n", a);
return 0;
}
示例8的运行结果是:a = 2
在示例8中虽然变量a一开始就不满足while后面的条件,但是还是执行了一次括号里面的循环体,这说明do-while循环是先执行循环体中的内容再判断条件成不成立。
循环结构(while)
一、
while循环结构的写法:
While(条件)
{
语句;
}
先判断条件是否成立,如果成立则执行括号里面的语句,然后再判断条件是否成立如果成立再次执行括号里面的语句,如此反复循环直到条件不成立为止。
示例9:
#include <stdio.h>
int main()
{
int a = 10;
while(a > 0)
{
a--;
}
printf("a = %d\n", a);
return 0;
}
示例9的运行结果是:a = 0
如果一开始条件不成立那么后面的循环体一次也不会执行。
二、
使用注意:
1> while(1){…..}是一个死循环。
2> while(a<10);{…}在条件后面加分号表示循环体是一个空语句,而非{}部分。
3> while条件语句后推荐使用{},否则只有第一条语句是循环体。
比如:while(条件) 语句1;语句2;
只有语句1是循环体的内容语句2不是。
4> 最简单的死循环 :while(1);
永远执行空语句,让程序崩溃。
循环结构(for)
一、
使用方法:
for(语句1,条件,语句2)
{
循环体
}
语句1:一般为初始化语句 。语句2:一般为增量或减量语句(执行完循环体后再执行的语句)。for循环一开始就会执行语句1(整个for循环只会执行一次),下面判断条件是否成立,若成立,则执行一次循环体,然后执行语句2,再次判断条件是否成立,若条件不成立则结束循环,若条件成立则继续执行循环体。
for循环相较于while循环,在性能上for循环稍胜一筹,因为while循环只能使用外部的变量用于条件判断,而for循环可以自己定义变量用于条件判断,这个变量会随着for循环的结束被及时回收。
示例10:
#include <stdio.h>
int main()
{
int sum = 0;
for (int i = 1; i <= 10; i++)
{
sum += i;
}
printf("sum = %d\n", sum);
return 0;
}
示例10利用for循环计算出了10以内的整数和,运行结果是:sum = 55
二、
for循环使用注意:
1. 不要随便在for语句后面写上分号,比如,for();{….} 这样for循环的循环体为空语句。
2. 定义变量的作用域不明确错误:
for(int i=0;i<5;i++)
int a=10; //编译器报错,变量作用域不明确
如果要在for循环体内定义变量则必须要加括号。
3. for循环中最简单的死循环写法:for(;;);
三、
for循环的嵌套使用:
for循环可以嵌套使用,下面利用嵌套for循环输出99减法表。
示例11:
#include <stdio.h>
int main()
{
int i,j;//定义两个整型变量控制for循环
for (i=1; i<=9; i++)//第一层for循环控制行数
{
for (j=1; j<=i; j++)//第二层for循环控制每行执行几次循环体即控制列数
{
printf("%d-%d=%d\t",i ,j, i-j);/*输出减数、被减数以及两数相减的差*/
}
printf("\n");//每行结束之后换行
}
return 0;
}
示例11的运行结果是:
1-1=0
2-1=1 2-2=0
3-1=2 3-2=1 3-3=0
4-1=3 4-2=2 4-3=1 4-4=0
5-1=4 5-2=3 5-3=2 5-4=1 5-5=0
6-1=5 6-2=4 6-3=3 6-4=2 6-5=1 6-6=0
7-1=6 7-2=5 7-3=4 7-4=3 7-5=2 7-6=1 7-7=0
8-1=7 8-2=6 8-3=5 8-4=4 8-5=3 8-6=2 8-7=1 8-8=0
9-1=8 9-2=7 9-3=6 9-4=5 9-5=4 9-6=3 9-7=2 9-8=1 9-9=0
break和continue
一、
break常用在switch结构(前面介绍不再敖述)和循环结构中,用在循环结构中它会跳出整个循环,也就是说可能在循环条件还成立的情况下循环被提前结束。
示例12:
#include <stdio.h>
int main()
{
int sum = 0;
for (int i = 1;i <= 10;i++)
{
sum += i;
if (i == 5)
{
break;//如果i等于5则结束整个for循环
}
}
printf("sum = %d\n", sum);//只计算了1~5之间的整数和,所以输出结果会是sum = 15
return 0;
}
示例12的运行结果是:sum = 15
二、
continue用在循环结构中,它的作用是跳过当次循环,继续执行下一次循环。
示例13:
#include <stdio.h>
int main()
{
int sum = 0;
for (int i = 1;i <= 10;i++)
{
if (i == 5)
{
continue;//结束当次循环,下面的语句不会再执行,继续下一次循环
}
sum += i;
}
printf("sum = %d\n", sum);/*因为当i等于5时循环跳出,所以sum没有加5,其它10以内的正整数都加了,所以sum最后是50,输出是sum = 50*/
return 0;
}
示例13的运行结果是:sum = 50