前言
C语言的语句可分为五类:
1.表达式语句
2.函数调用语句
3.控制语句
4.复合语句
5.空语句
本篇我们主要探讨的是控制语句里的分支与循环。
控制语句又分为以下三类:
- 条件判断语句也叫分支语句:
if
语句、switch
语句; - 循环语句:
do while
语句、while
语句、for
语句; - 转向语句:
break
语句、goto
语句、continue
语句、return
语句。
一、分支语句
所谓分支,就是选择。
1.if语句
if语句的语法结构
单if
if(表达式)
语句;
if-else
if(表达式)
语句1;
else
语句2;
多分支
if(表达式1)
语句1;
else if(表达式2)
语句2;
else
语句3;
如果表达式为真,则语句执行,为假则进入下一个分支。(0为假,非零为真)
这里的{ }
是代码块,表示这个代码所属于前面的语句。
#include<stdio.h>
int main()
{
int score = 0;
scanf("%d", &score);
if (score < 60)
{
printf("不及格\n");
}
else if (score >= 60 && score < 80)
{
printf("及格\n");
}
else if (score >= 80 && score < 90)
{
printf("优秀\n");
}
else
{
printf("特优\n");
}
return 0;
}
里面的语句只有一条的话可以不加{ }
,但不管语句是一条还是多条,建议都加上{ }
,这样不容易出错。
悬空else
看这段代码,会输出world吗?
#include<stdio.h>
int main()
{
int a = 0;
int b = 20;
if (a == 1)
if (b == 100)
printf("hello\n");
else
printf("world\n");
return 0;
}
当然不会,什么也不会输出。因为else只会和离它最近的if匹配。
这种写作习惯不好,读起来也费劲。适当的使用{}可以使代码的逻辑更加清楚。提高可读性。
改正后
#include<stdio.h>
int main()
{
int a = 0;
int b = 20;
if (a == 1)
{
if (b == 20)
{
printf("hello\n");
}
}
else
{
printf("world\n");//走到这里输出world
}
return 0;
}
2.switch语句
switch语句常常用于多分支的情况。
用法
switch(整型表达式)
{
case 整形常量表达式:
语句;
}
break
在switch语句中,我们没办法直接实现分支,搭配break使用才能实现真正的分支。
在执行case分支语句时,程序遇到break才会停止,否则会一直向后执行其它的case语句,达不到分支选择的效果。
default
可以在语句列表中增加一条default语句,当 switch 表达式的值并不匹配所有 case 标签的值时,这个 default 子句后面的语句就会执行。
不过也可以不加,程序不做处理会继续向后执行。
比如输入数字来输出对应星期几
#include<stdio.h>
int main()
{
int day = 0;
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("error\n");
break;
}
return 0;
}
并不是每条语句都需要break,按需求来写。
比如想要实现1-5输出weekday,6-7输出weekend
#include<stdio.h>
int main()
{
int day = 0;
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("error\n");
break;
}
return 0;
}
break语句的实际效果是把语句列表划分为不同的分支部分,防止连续执行。
每一个switch语句中有且只有一条default语句,它可以出现在语句列表的任何位置,并非一定在最末尾的位置,只是习惯放到最后。
二、循环语句
对于if语句,如果()里面的表达式为真,语句则会执行一次,如果要执行多次,就需要用到循环语句
1.while循环
语法结构
while(表达式)
{
循环语句;
}
使用while循环打印1~10
#include<stdio.h>
int main()
{
int i = 1;
while (i <= 10)
{
printf("%d ", i);
i++;
}
return 0;
}
while中的break
指令可以直接永久终止当前循环,跳出本层循环
#include<stdio.h>
int main()
{
int i = 1;
while (i <= 10)
{
if (i == 7)
{
break;
}
printf("%d ", i);
i++;
}
return 0;
}
结果输出1 2 3 4 5 6,在 i 等于7的时候触发break指令终止循环
while中的continue语句可以终止本次循环,后面代码不会再执行,直接跳转到while语句的判断部分进入下一次循环
下面这样写正确吗?
#include<stdio.h>
int main()
{
int i = 1;
while (i < 10)
{
if (i == 7)
{
continue;
}
printf("%d ", i);
i++;
}
return 0;
}
程序会发生死循环,因为 i 等于7时后面语句不会再执行,i 也不会+1,会一直判断,一直continue陷入死循环
应当这样写
#include<stdio.h>
int main()
{
int i = 0;
while (i < 10)
{
i++;
if (i == 7)
{
continue;
}
printf("%d ", i);
}
return 0;
}
区别: 在一层循环中一般有多次循环,break结束的是本层循环,而continue结束的是本次循环
2.for循环
语法结构
for(表达式1; 表达式2; 表达式3)
循环语句;
使用for循环打印1~10
#include<stdio.h>
int main()
{
for (int i = 1; i <= 10; i++)
{
printf("%d ", i);
}
return 0;
}
对比while循环和for循环
for循环将三个必须条件集中起来,方便查找修改。for循环的风格更胜一筹,使用的频率也最高。
3.do…while循环
语法结构
do
循环语句;
while(表达式);
与while循环不同的是,do…while循环是先执行一遍循环语句,再判断
#include<stdio.h>
int main()
{
int i = 1;
do
{
printf("%d ", i);
i++;
} while (i <= 10);
return 0;
}
其break和continue用法与while循环用法一样。
三、转向语句
break语句和continue语句上面已经探讨过,接下来就不再说明了。
1.return语句
语法结构
return 表达式;
return 语句的作用是从当前函数退出,并从该函数返回一个值。
主要用于函数中,最常见的就是主函数末尾return 0;
#include<stdio.h>
int main()
{
return 0;
}
这是一个判断闰年的函数
#include<stdio.h>
int is_leap_year(int y)
{
if((y % 4 == 0 && y % 100 != 0) || (y % 400 == 0))
return 1;
else
return 0;
}
int main()
{
int ret = is_leap_year(2024);
if (ret == 1)
printf("闰年\n");
else
printf("不是闰年\n");
return 0;
}
return语句只要执行,其所在函数便会终止。
大家可以在for循环中加入return试试看。
2.goto语句
break语句只能跳出一层循环
goto语句可以一次跳出两层或多层循环
for (...)
{
for (...)
{
for (...)
{
if (表达式)
goto error;
}
}
}
error:
//处理特殊情况
goto语句也称为无条件转移语句
从理论上 goto语句是没有必要的,实践中没有goto语句也可以很容易的写出代码。
goto语句常用于终止程序的深度嵌套,比如跳出两层或多层循环。