由前面的知识我们可以知道C语⾔是一种结构化的程序设计语⾔,这⾥的结构包括顺序结构、选择结构、循环结构,在C语言中我们可以使⽤ if 、 switch语句 实现分⽀结构,使⽤ for 、 while 、 do while语句实现循环结构。
接下来,我们一一介绍:
if语句的一般形式为:
if(表达式)
语句1
当表达式为真(非0)时,语句1执行;当表达式为假(0)时,语句1就不会执行。
通常if会与else一起用,一般形式为:
if(表达式)
语句1
else
语句2
当表达式1不成立时,就会执行else后面的语句2.
需要特别注意的是if后面默认只控制一条语句,如果需要if后面执行多条语句的话,就需要将控制的多条语句用{ }括起来。
这里通过一个代码来更好地理解:
#include<stdio.h>
int main()
{
int a = 0;
if(a >= 18)
printf("成年人");
else
printf("未成年人");
return 0;
}同时在多种分支的情况下,可以在else部分又嵌套多层的if语句,它的一般形式为:
if(表达式1)
语句1
else if
语句2
else if
语句3
else
语句4
悬空else问题
在这里,我们需要记住的是“如果有多个 if 和 else , else 总是跟最接近的 if 匹配,而不是与对齐的if匹配。
你知道下面的代码输出结果是什么吗?
#include<stdio.h>
int main()
{
int a = 0;
int b = 2;
if (a == 1)
if (b == 2)
printf("hello\n");
else
printf("haha\n");
return 0;
}事实上,它什么也不会输出,else与第二个if进行匹配,因为第一个if后面的表达式为假,就不会执行后面的了。

除了 if 语句外,C语⾔还提供了 switch 语句来实现分⽀结构。 事实上switch 语句是⼀种特殊形式的 if...else 结构,⽤于判断条件有多个结果的情况,适合多分支结构,它把多重 的 else if 改成更易⽤、可读性更好的形式。
它的一般形式为:
switch(表达式)
{
case 常量1:
语句1
case 常量2:
语句2
..................
case 常量n:
语句n
default:
语句n+1;
}
注意:
1.表达式必须是整型(包括字符型-----字符的本质是ASCII值,所以字符类型也归类到整型类型)表达式。
2.switch后面的{ }中是一个复合语句,一般来讲会有多个以关键字case开头的语句行和最多一个以default开头的行。当switch 后的表达式中的值⽆法匹 配代码中的 case 语句的时候,这时候可以不做处理,也可以在在 switch 语句中加⼊ default ⼦句。
3.case后面的值必须是整型常量(表达式),同时case 和后边的表达式之间必须有空格,如:case ‘A',case 1,它们和default都是起标号的作用,来标志一个位置
4.在 switch 语句中 case 语句和 default 语句是没有顺序要求的,只要你的顺序是满⾜实 际需求的就可以了,不过我们通常是把 default ⼦句放在最后处理的。
5.每一个case常量必须互不相同,否则会出现互相矛盾,一个常量有多个执行方案。
6.switch 语句也是分⽀效果的,只有在 switch 语句中使⽤ break 才能跳出 switch 语 句,如果某⼀个 case 语句的后边没有 break 语句,代码会继续往下执⾏,有可能执⾏其他 case 语句中的代码,直到遇到 break 语句或者 switch 语句结束。所以在 switch 语句中 break 语句是⾮常重要的,能实现真正的分⽀效果。 当然,使用时需要结合实际情况,并不是每个 case 语句都得有break。
下面就来使用一个switch语句的代码来体会它的效果:

可以看出使用switch语句来处理多分支结构比if else语句更加简便。
while语句一般形式:
while(表达式)
{
}
while的执行流程是: ⾸先执⾏判断表达式 ,表达式的值为0,循环直接结束;表达式的值不为0,则执⾏循环语 句,语句执⾏完后再继续判断,是否进⾏下⼀次判断。
for ( 表达式 1 ; 表达式 2 ; 表达式 3 )
语句; // 如果循环体想包含更多的语句,可以加上⼤括号
表达式1 : ⽤于循环变量的 初始化 ,只需要执行一次,可以给零个、一个或者多个变量设置初始值。
表达式2 :⽤于循环结束条件的 判断 ,每一次执行循环体前先执行这个表达式,决定是否继续执行循环。
表达式3 :⽤于循环变量的 调整
表达式1和表达式3可以是一个简单的表达式,也可以是一个逗号表达式(包含多个简单表达式)
事实上,for 和 while 在实现循环的过程中都有初始化、判断、调整这三个部分,但是 for 循环的三个部 分⾮常集中,便于代码的维护,⽽如果代码较多的时候 while 循环的三个部分就⽐较分散,所以从形 式上 for 循环要更优⼀些。
for ( 表达式 1 ; 表达式 2 ; 表达式 3 )
语句;
for语句一般形式可以改写成:
表达式1;
while(表达式2)
{
语句
表达式3;
}
这两个无条件等价。
dowhile一般形式:
do
{
语句
}while(表达式 ); 后面有分号;
前面所说的 while 和 for 这两种循环都是 先判断 ,条件如果满⾜就进⼊循环,执⾏循环语句,如果不满⾜就跳 出循环;
do while 循环语句则是 先直接进⼊循环体,执⾏循环语句 ,然后再执⾏ while 后的判断表达式,表达式为真,就会进⾏下⼀次循环,表达式为假,则不再继续循环。 所以在 do while 语句中 循环体是⾄少执行⼀次。
接下来我们用这三个代码来解决同一个问题:输出1--50可以被3整除的数
while循环
#include<stdio.h>
int main()
{
int i = 1;
while (i <= 50)
{
if (i % 3 == 0)
printf("%d ", i);
i++;
printf("\n");
return 0;
}
for循环
#include<stdio.h>
int main()
{
int i = 1;
for (i = 1; i <= 50; i++)
{
if (i % 3 == 0)
printf("%d ", i);
}
printf("\n");
return 0;
}
do while循环
#include<stdio.h>
int main()
{
int i = 1;
do
{
if (i % 3 == 0)
printf("%d ", i);
i++;
} while (i <= 50);
printf("\n");
return 0;
}
可以看出它们输出的结果是一致的
break 的作⽤是⽤于 永久的终⽌循环 ,只要 break 被执⾏,直接就会跳出循环,继续往后执
⾏。
continue 的作⽤是 跳过本次循环中 continue 后边的代码 ,只是 结束本次循环 ,继续执行下次的循环的判断。
在使用上,break在三种循环语句差别不大。
这里需要特别注意的是 continue在 for 循环和 while 循环中是有所差异的。
在while循环中:continue 可以帮助我们跳过某⼀次循环 continue 后边的代码,直接到循环的判断部分,进⾏下⼀次循环的判断,如果循环的调整是在 continue 后边的话,可能会造成 死循环。
在 for 循环 中 : continue 的作⽤是跳过本次循环中 continue 后的代码, 直接到循环的调整部分 。
我们用下面的代码来进行更好的理解!(输出1--50被3整除的数,使用continue版)


可以看出当使用continue时,在while循环中循环的调整是在 continue 后边,造成了死循环(i一直等于36)
除此之外,我们需要注意的是continue只能在循环中使用,而break可以在switch和循环语句中使用,但是break不能与if语句单独使用。
C语⾔提供了⼀种⾮常特别的语法,就是 goto 语句和跳转标号, goto 语句可以实现在同⼀个函数内跳转到设置好的标号处。

但是如果goto 语句使⽤不当,就会导致在函数内部随意乱跳转打乱程序的执⾏流程,所以建议是能不⽤尽量不去使⽤。
如果在多层循环的代码中,循环想提前退出得使⽤ break ,⼀个 break 只能跳出⼀层循环,所以如果想快速跳出循环的话使⽤ goto语句就更加的方便。
用两个例子来说明:
1.打印100--150的素数

2.打印4*4矩阵
