目录
引言
由前面的知识我们可以知道C语⾔是一种结构化的程序设计语⾔,这⾥的结构包括顺序结构、选择结构、循环结构,在C语言中我们可以使⽤ if 、 switch语句 实现分⽀结构,使⽤ for 、 while 、 do while语句实现循环结构。
接下来,我们一一介绍:
分支(选择)语句
if语句
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后面的表达式为假,就不会执行后面的了。
switch语句
除了 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(表达式)
{
}
for语句
}
这两个无条件等价。
do while语句
dowhile一般形式:
do
{
语句
}while(表达式 ); 后面有分号;
应用
#include<stdio.h>
int main()
{
int i = 1;
while (i <= 50)
{
if (i % 3 == 0)
printf("%d ", i);
i++;
printf("\n");
return 0;
}
#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;
}
#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
continue
使用
在使用上,break在三种循环语句差别不大。
这里需要特别注意的是 continue在 for 循环和 while 循环中是有所差异的。
在while循环中:continue 可以帮助我们跳过某⼀次循环 continue 后边的代码,直接到循环的判断部分,进⾏下⼀次循环的判断,如果循环的调整是在 continue 后边的话,可能会造成 死循环。
可以看出当使用continue时,在while循环中循环的调整是在 continue 后边,造成了死循环(i一直等于36)
除此之外,我们需要注意的是continue只能在循环中使用,而break可以在switch和循环语句中使用,但是break不能与if语句单独使用。
goto语句
C语⾔提供了⼀种⾮常特别的语法,就是 goto 语句和跳转标号, goto 语句可以实现在同⼀个函数内跳转到设置好的标号处。
但是如果goto 语句使⽤不当,就会导致在函数内部随意乱跳转打乱程序的执⾏流程,所以建议是能不⽤尽量不去使⽤。
如果在多层循环的代码中,循环想提前退出得使⽤ break ,⼀个 break 只能跳出⼀层循环,所以如果想快速跳出循环的话使⽤ goto语句就更加的方便。
循环的嵌套使用
用两个例子来说明:
1.打印100--150的素数
2.打印4*4矩阵