C语言中的三种最基本控制结构分别为
1,顺序机构
2,选择结构
3,循环结构
这里简单介绍一下选择结构(分支语句)和循环结构(循环语句)
以下为if语句的几种用法
if(条件判断)
语句;
----------------------
if(条件判断1)
语句1;
else(条件判断2)
语句2;
----------------------
if(条件判断1)
语句1;
else if(条件判断2)
语句2;
else if(条件判断3)
语句3;
//第二种和第三种用法可以实现多分支语句
在if语句中,程序执行的时候会从前往后依次判断条件是否成立,如果成立则进入该分支中;不成立则继续下一个分支的条件判断 。直到条件成立进入分支或所有分支判断完全。
如下图所示:
需要注意!C语言中0表示假,非0表示真
例如
if(0)
printf("hehe");
该代码不会输出任何东西
而
int a=0;
if(a==0)
printf("hehe");
就能正常打印出hehe。
因为a==0成立,所以实际上该判断的值为1,即为真。
switch的基本语法结构为
switch(整形表达式)
{
case 整型常量1:
语句;
case 整型常量2:
语句;
}
在switch语句中,我们需要选择分支的入口;
例如:
int day=0;
scanf("%d",&day);
switch(day)
{case(1):
printf("星期一\n");
case(2):
printf("星期二\n");
case(3):
printf("星期三\n");
case(4):
printf("星期四\n");
case(5):
printf("星期五\n");
}
按照上面说的,这个程序实现起来应该是输入1,输出星期一;输入2,输出星期二……但实际执行起来的结果是如下
这里可以看到,当我们输入3时,程序输出了星期三,星期四,星期五。这是因为switch语句单独使用时选择的是程序的入口,当我们选择后,程序会从该入口开始执行直到结束。所以switch单独使用时是无法实现分支的。应该搭配break来使用。break可以使switch语句执行完分支语句后跳出switch语句
如图,当在每个分支后加上break,就可以实现跳出switch了。
如果输入的选择不是任何一条分支的时候应该如何处理?switch语句中提供了default来处理这种情况
当输入的值不是任何一条确定分支时,就会进入到default语句中。
编程中,我们经常会遇到需重复执行某条程序,这时候就可以用循环语句来快速实现
while循环语句的基本语法结构为:
while(条件判断)
{
循环体;
}
当满足条件后,程序便会进入到while语句的循环体中,每一次执行完后便会再次判断条件,如果满足则再一次进入到循环中,也就是先判断在循环。如下图所示:
直到条件不满足,循环结束。我们来看一个例子:
int a=0;
while(a<3)
{
printf("hehe\n");
}
该程序就能不断打印输出hehe。但该程序有一个致命的问题,每次循环过后a的值没有任何变化,导致每次条件判断都成立,程序进入死循环,不断重复输出hehe。
为了避免这种情况的出现,我们应完善代码,让每次循环过后,变量a的值发生变化。
int a=0;
while(a<3)
{
printf("hehe\n");
a++;
}
更改过后的代码在运行时,第一次a的值为0,进入while循环打印一个hehe后,a的值变为1;再次判断符合条件进入while循环打印hehe,a的值变为2;再重复打印一次hehe后a的值变为3。此时a=3不符合条件,循环结束,一共打印了三个hehe。
do while语句的基本语法为
do
{
循环体;
}
while(条件判断);
do while循环执行的流程图如下:
do while循环与while循环十分相似,二者不同的区别在于while循环是先进行条件判断符合条件在进入循环体,条件判断次数要比循环执行次数多一次;而do while循环是先执行一次循环体后在进行条件判断,条件判断次数与循环体执行次数是一致的。
for循环的基本语法为
for(初始化变量;条件判断;变量改变)
{
循环体;
}
例如用for循环打印1~3:
for(int a=1;a<4;a++)
{
printf("%d\n",a);
}
实际上for循环其实与while循环类似,先判断条件,满足条件后进入循环体中,执行完一次后变量改变,再一次进行条件判断,直到条件不满足循环结束。
以该代码为例,for循环的流程图如下:
同while循环,for循环语句中条件判断次数也要比循环体执行次数多一次。
在之前的switch语句中,我们已经知道了break可以跳出switch语句,同理,在循环语句中,我们也可以用break来提前结束循环,我们用for循环来举例:
for(int a=1;a<4;a++)
{
printf("%d\n",a);
}
已知该代码可以打印1~3,如果我们想让程序打印完2之后直接结束循环,可以在循环体中增加一个if语句来判断是否要结束循环:
for(int a=1;a<4;a++)
{
printf("%d\n",a);
if(a==2)
break;
}
该代码的输出结果为:
可以发现,当程序打印到2时循环就结束了,这是因为当if(a==2)成立,break直接跳出了for循环。用流程图来表示,如下:
要注意,当多层for循环嵌套时,break只能跳出当前所属的一层for循环
continue在循环中的作用是跳过该次循环后面的程序,同样我们用for循环来举例:
for(int a=1;a<4;a++)
{if(a==2)
continue;
printf("%d\n",a);
}
该代码的执行结果为:
可以看到,循环直接跳过了2,只打印了1,3两个数字。这是因为当if(a==2)成立,continue跳过了该次打印的步骤。用流程图表示如下:
上述break和continue的用法在while语句和do while语句中同样适用。
但是,需要注意!!!
在while和do while 语句中使用continue是要将变量改变放在continue前,否则容易进入死循环
如下面的代码:
int a=0;
while(a<3)
{
printf("%d\n",a);
if(a==2)
continue;
a++;
}