C语⾔是结构化的程序设计语⾔,能解决我们生活遇到中遇到的方方面面的问题,而如果我们仔细分析我们就会发现⽇常所⻅的事情都可以拆分由顺序结构、选择结构、循环结构三个部分,或由这三个部分组成。所以C语言也必包含这三种结构,而这也是C语言的结构化体现。
一:分支结构
1:if语句
语法格式:
if (表达式)
{
语句1;
语句2;
.
.
.
}
表达式成立(为真)则语句依次执行,表达式不成立(为假)则不执行。
注意:当有多条语句时,如图所示:应用 { } 将多条语句括起来组成复合语句即代码块;当只有一条语句时则无需使用 { },这一点无论在分支结构还是循环结构都适用。不过为使代码结构清晰,建议都加上 { }。
2:if - else 语句
语法格式:
if (表达式1)
{
语句a;
}
else
{
语句b;
}
表达式为真则执行语句a(语句a可能有多条语句),否则执行语句b(语句b也可能有多条语句)。
注意:相比 if语句,if-else 语句一定会执行,要么执行语句a要么执行语句b。
3:悬空的else
如果有多个 if 和 else ,可以记住这样⼀条规则, else 总是跟最接近的 if 匹配。
#include <stdio.h>
int main()
{
int a = 0;
int b = 2;
if(a == 1)
if(b == 2)
printf("hehe\n");
else
printf("haha\n");
return 0;
}
运行结果为什么都不打印,因为如果有多个 if 和 else 总是跟最接近的 if 匹配,为使代码逻辑清新且符合语法规则建议在每个 if 和 else 都加上 { } ;
4:if语句的嵌套
a:在else处嵌套:
语法格式:
if (表达式1)
{
语句a;
}
else {
if (表达式2)
{
语句b;
}
else
{
if (表达式3)
{
语句c;
}
else
{
.
.
.
}
}
}
上述格式也可以简化为如下格式:
if (表达式1)
{
语句a;
}
else if (表达式2)
{
语句b;
}
else if (表达式3)
{
语句c;
}
.
.
.
else
{
语句n;
}
简化后:
若表达式1为真则执行语句a,若表达式1为假则判断表达式2,
若表达式2为真则执行语句b,若表达式2为假则判断表达式3,
以此类推. . .
当所有else if 后的表达式为假时,则执行语句n。
注意:首先:判断 表达式n 时已经判断好了 表达式(n-1) ~ 表达式1 全为假;
其次:该嵌套语句一定有且仅有一条语句被执行。
以下验证在else处嵌套后与其简化后效果一致,以输入成绩为例:
特别注意:当在else处嵌套时若末尾无else语句则该嵌套语句可能不被执行
代码演示:
int main() {//方式一
int score = 0;
scanf("%d", &score);
if (score >= 90)
{
printf("优秀\n");
}
else if (score >= 80)
{
printf("良好\n");
}
return 0;
}
int main() {//方式二
int score = 0;
scanf("%d", &score);
if (score >= 90)
{
printf("优秀\n");
}
else {
if (score >= 80)
{
printf("良好\n");
}
}
return 0;
}
运行结果:当输入75时都为什么都不执行;
b:在 if处嵌套:
语法格式:
if (表达式1)
{
if (表达式2)
{
if (表达式3)
{
.
.
.
}
else
{
表达式c;
}
}
else
{
表达式b;
}
}
else
{
表达式a;
}
代码演示:
5:switch语句:
语法格式:
switch (表达式) {
case value1:
语句1;
case value2:
语句2;
.
.
.
default:
语句n;
}
switch 语句是⼀种特殊形式的 if...else 结构,⽤于判断条件有多个结果的情况。它把多重的 else if 改成更易⽤、可读性更好的形式;
代码演示:
#include <stdio.h>
int main()
{
int day = 0;
scanf("%d", &day);
switch (day)
{
case 1:
printf("星期一\n");
break;
case 2:
printf("星期二\n");
break;
case 3:
printf("星期三\n");
break;
case 4:
printf("星期四\n");
break;
case 5:
printf("星期五\n");
break;
case 6:
printf("星期六\n");
break;
case 7:
printf("星期天\n");
break;
default:
printf("输入错误\n");
break;
}
return 0;
}
运行结果:
3
星期三
7
星期天
8
输入错误
注意:
上⾯代码中,根据表达式不同的值,执⾏相应的 case 分⽀。如果找不到对应的值就执行 default分支;
语句中若含有break,则执行该语句后,后直接跳出switch语句,即不执行该语句之后的所有 语句;
若无break则一直向下执行下列语句直到遇到break语句为止;
代码演示:
#include <stdio.h>
int main()
{
int day = 0;
scanf("%d", &day);
switch (day)
{
case 1:
printf("执行1\n");
case 2:
printf("执行2\n");
case 3:
printf("执行3\n");
case 4:
printf("执行4\n");
case 5:
printf("工作日\n");
break;
case 6:
case 7:
printf("休息日\n");
break;
default:
printf("输入错误\n");
break;
}
return 0;
}
运行结果:
2
执行2
执行3
执行4
工作日
若switch语句中都不含break则执行到 '}' 自动结束;
另外default语句与case语句的顺序不影响代码;
二: 循环结构
C语⾔提供了3种循环语句,分别为:while循环、for循环、do - while循环;每种循环都包含循环变量的初始化、循环条件的判断、循环变量的更新三个部分;不同循环结构三个部分的进行顺序不同。
1:while循环
语法格式:
while(表达式)
语句;//如果循环体想包含更多的语句,可以加上⼤括号
代码演示:打印1+2+3+..100的和:
//打印1+2+3+..+100的和
int main() {
int i = 1, sum = 0;//循环变量i的初始化
while (i<=100)//循环条件的判断
{
sum += i;
i++;//循环变量的更新
}
printf("%d\n", sum);
return 0;
}
运行结果:
5050
2:for循环
语法格式:
for (表达式1;表达式2;表达式3)
{
语句;
}
相比while循环,for循环将循环结构三个部分:循环变量的初始化、循环条件的判断、循环变量的更新集中在了一起,并分别对应表达式1、表达式2、表达式3;另外for循环中表达式可以省略
代码演示:打印1+2+3+..100的和:
int main() {
int i = 0, sum = 0;
for (i = 1; i <= 100; i++)
{
sum += i;
}
printf("%d\n", sum);
return 0;
}
int main() {
int i = 1, sum = 0;
for (; i <= 100; )
{
sum += i;
i++;
}
printf("%d\n", sum);
return 0;
}
运行结果都为
:
5050
3:do - while循环
语法格式:
do {
语句;
} while(表达式);
代码演示:打印1+2+3+..100的和:
int main() {
int i = 1, sum = 0;// 循环变量i的初始化
do {
sum += i;
i++;//循环变量的更新
} while (i <= 100);//循环条件的判断
printf("%d\n", sum);
return 0;
}
运行结果:
5050
注意:相比 while循环 和 for循环 do - while 循环是先执行语句在判断循环条件;
4:break和continue语句
在循环执⾏的过程中,如果某些状况发⽣的时候,需要提前终⽌循环,这是⾮常常⻅的现象。C语⾔中 提供了 break 和 continue 两个关键字应⽤到循环中。
a:break语句的使用:
break 的作⽤是⽤于永久的终⽌循环,只要 break 被执⾏,直接就会跳出循环,继续往后执行 。
代码演示:判断是否为素数,设num大于2
//判断是否为素数,设num大于2
int main() {
int i = 0, num = 0;
scanf("%d", &num);
for (i = 2; i <= num - 2; i++) {
if (num % i == 0) {
printf("不是素数\n");
break;
}
}
if (i == num - 1)
{
printf("是素数\n");
}
return 0;
}
运行结果:
45
不是素数
分析:当num % i 为0时就会打印 ”不是素数“ ,并跳出循环。
当去掉break后,由于没有跳出循环就会一直打印 ”不是素数“
去掉break后运行结果:
45
不是素数
不是素数
不是素数
不是素数
是素数
b:continue语句的使用:
continue 的作⽤是跳过本次循环 continue 后边的代码,在 for 循环和 while 循环中有所差异的。
continue在for循环中的使用:
代码演示:
#include <stdio.h>
int main()
{
int i = 1;
for(i=1; i<=10; i++)
{
if(i == 5)
continue;//这⾥continue跳过了后边的打印,来到了i++的调整部分
printf("%d ", i);
}
return 0;
}
运行结果:
1 2 3 4 6 7 8 9 10
注意:在for循环中使用continue不会跳过循环变量的更新语句即 i++ ,所以运行结果只跳过了5
continue在while循环中的使用:
代码演示:
int main() {
int i = 1;
while (i <= 10)
{
if (i == 5)
{
printf("%d ", i);
continue;
}
i++;
}
return 0;
}
运行结果为:死循环打印5
分析:当执行if (i == 5)时,continue会跳过 i++ 语句,使得 i 一直等于5
总结:continue在for循环中不会跳过循环变量的更新语句,而在while循环中若循环变量的更新语句在continue后则会跳过跳过循环变量的更新语句,使循环变量保持不变;
continue在do - while 的使用:
continue在do - while循环中的使用与while循环中基本相同
5:循环嵌套:
代码演示:打印99乘法口诀表:
int main() {
int i = 0, j = 0;
for (i = 1; i <= 9; i++)
{
for (j = 1; j <= i; j++)
{
printf("%d*%d=%2d ", j, i, i * j);
}
printf("\n");
}
}
运行结果:
1*1= 1
1*2= 2 2*2= 4
1*3= 3 2*3= 6 3*3= 9
1*4= 4 2*4= 8 3*4=12 4*4=16
1*5= 5 2*5=10 3*5=15 4*5=20 5*5=25
1*6= 6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36
1*7= 7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49
1*8= 8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64
1*9= 9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81
6:goto语句 :
goto 语句可以实现在同⼀个函数内跳转到设置好的标号处。
语法格式:
goto 语句标号;
语句标号:
语句;
语句标号可以在任意位置,可在 ”goto 语句标号;“ 之前 、之后,还可以在其他函数处;
代码演示(在同一函数中):
int main()
{
printf("first\n");
goto next;
printf("second\n");
next:
printf("third\n");
return 0;
}
运行结果:
first
third
优点:在多层循环的代码中,如果想快速跳出 使⽤ goto 就非常的方便
缺点:goto 语句如果使⽤的不当,就会导致在函数内部随意乱跳转,打乱程序的执行流程