在C语言中,代码有着各种各样的执行流程,主要包括顺序结构、分支结构、循环结构。顺序结构顾名思义就是一行行往下执行的流程,此处不赘述了;本篇主要讲分支结构和循环结构。
分支结构
if语句
结构为:
if(表达式)
{
语句;
}
若条件为真执行语句,否则跳过该语句。
if(表达式)
{
正确时执行语句;
}
else
{
错误时执行语句;
}
若条件为真执行第一个语句,否则执行第二个语句。
if(表达式_1)
{
语句_1;
}
else if(表达式_2)
{
语句_2;
}
else if(表达式_3)
{
语句_3;
}//....
else
{
语句_n;
}
由上到下判断条件,若为真则执行条件后的语句,然后执行if 语句后的语句,否则继续判断,若都不符合则执行最后一个else 后的语句。
注意:else 只与最近的if 配对。
一个if 语句示例:
int age = 0;
printf("Please input your age:>");
scanf("%d", &age);
if (age <= 19)
{
printf("teenager\n");
}
else if (age <= 60)
{
printf("adult\n");
}
else
{
printf("elder\n");
}
关于表达式:在C语言的真假判断中,0 是假,非 0 是真;在关系运算中,若为真则结果为1,若为假则结果为0.
switch语句
结构为:
switch(整型表达式)
{
case 常量_1 : 语句_1;[break;]
case 常量_2 : 语句_2;[break;]
case 常量_3 : 语句_3;[break;]
//...
[default : 语句_n;]
}
判断表达式的值与case后的常量是否相等,若相等则执行case 后的语句,并向下执行直至break;
或}
。若都不符合则执行default 后的语句。
注意:表达式必须是整型表达式,case 后必须是一个整型常量。
一个switch 语句示例:
int day = 0;
printf("Please input a day:>");
scanf("%d", &day);
switch(day)
{
case 1 :
printf("Monday\n");
break;
case 2 :
printf("Tuesday\n");
break;
case 3 :
printf("Wednesday\n");
break;
case 4 :
printf("Thursday\n");
break;
case 5 :
printf("Friday\n");
break;
case 6 :
printf("Saturday\n");
break;
case 7 :
printf("Sunday\n");
break;
default : printf("Wrong number\n");
}
不加break;
的妙用:在多种情况都需要执行相同语句时可以不加break;
。如:
int day = 0;
printf("Please input a day:");
scanf("%d", &day);
switch(day)
{
case 1 :
case 2 :
case 3 :
case 4 :
case 5 :
printf("Weekday\n");
break;
case 6 :
case 7 :
printf("Weekend\n");
break;
default : printf("Wrong number\n");
}
switch语句还有一个小细节:在case后不可以定义变量。如:
int a = 0;
switch (a)
{
case 0:
int b = 4;
printf("%d", b);
}
这段程序在VS和Dev C++中都会报错。解决办法:
int a = 0;
switch (a)
{
case 0:
{
int b = 4;
printf("%d", b);
}
}
在case后放一个代码块就可以了。当然,使用函数调用的方法也是可以的。
更深层次理解分支
任何分支,都需要经过以下几个过程:判定、分支。在if语句中,执行流程大致是这样的:
①执行括号中的表达式,得到真假结果(注意,是执行);
②判定条件;
③分支执行语句。
这点可以增进对if的理解。如新手常犯的错误:if (a = 5)
,这里本来可能是要判断变量a是否等于5,但少写了一个=。按照上面的执行流程,首先执行()
中的表达式,=是赋值符,将5赋值给变量a,接下来判断,a是5,在C语言中,0为假非0为真,5当然是真,所以这实际上是一个必定真的表达式。如果改成if (a = 0)
,就变成了必定假的表达式。
事实上,C语言这样设计,大大增加了C语言的灵活性,使得代码有了更多的变化和可能。
再看switch语句的结构:
switch(整型表达式)
{
case 常量_1 : 语句_1;[break;]
case 常量_2 : 语句_2;[break;]
case 常量_3 : 语句_3;[break;]
//...
[default : 语句_n;]
}
这其中,switch本身并没有太多的作用,case就起到了判定的作用,那分支呢?我们知道,不加break;
会使switch语句一直向下执行,直至break;
或}
,所以break;
起到的就是分支的作用。
循环结构
在C语言中循环有三种,在大部分情况下这三种结构都可以互换,因此熟练掌握其中一种就足以应付大部分情况。
while语句
结构为:
while(表达式)
{
语句;
}
若表达式为真开始执行,重复执行语句直至表达式为假。
流程图:
建议:为避免陷入死循环,在使用while 循环时应包括四个部分:I(初始化,initialize)T(判断,test)E(执行,execute)M(修正,modify)。缺少其中一个或使其中一个无法执行都应当引起重视。一个标准的while 循环语句:
int i = 1;//初始化
while(i <= 10)//判断
{
printf("%d ", i);//执行
i++;//修正
}
一个while 语句的运用实例:清空缓存区:
int ch = 0;
while((ch = getchar()) != EOF && ch != '\n');
for语句
结构为:
for(表达式1;表达式2;表达式3)
{
语句;
}
三个表达式分别为初始化、判断、修正。
首先进行初始化,然后判断,若为真则开始执行语句,每循环一次都进行一次修正,直至判断为假。
流程图:
建议:①不要随意在循环体中改变控制变量的值,可能会引发死循环。②控制变量的判断范围最好使用前闭区间、后开区间的写法。例如执行10次循环,就可以写作for (i = 0;i < 10; i++){}
的形式,这样可以直观地知道程序执行10次
一个for 循环语句示例:
int i = 0;
for (i = 1; i <= 10; i++)
{
printf("%d ", i);
}
do while语句
结构为:
do
{
语句;
}
while(表达式);
先执行语句,然后判断表达式,若为真接着执行循环体直至为假,若为假则结束循环。
注意:在while 后的括号后有一个分号,不要漏了。
流程图:
可以看出,do…while 语句至少执行一次。
一个do…while 语句的实例:
int i = 0;
do
{
i++;
printf("%d ", i);
}while(i < 10);
break语句、continue语句
当循环执行到break;
时,直接跳出循环。注意,每一个break;
只能跳出一个循环。
当循环执行到continue;
时,直接跳过当前循环并判断执行下一次循环。
这两个语句在不同循环中的作用已在不同循环的流程图中表现了出来。
实战
九九乘法表
int i = 0, j = 0;
for(i = 1;i <= 9;i++){
for(j = 1;j <= i;j++){
printf("%d * %d = %d ", i, j, i * j);
}
printf("\n");
}