博客主页:江池俊的博客
收录专栏:C语言——探索高效编程的基石
如果觉得博主的文章还不错的话,请点赞收藏 三连支持一下博主
“每一天都是一个全新的机会,用积极的心态去迎接挑战吧!”
前言
一、什么是语句?
二、分支语句(选择结构)
2.1.if语句
2.1.1 悬空else
2.1.2 if书写形式的对比
2.2 switch语句
2.2.1 在switch语句中的 break
2.2.2 default子句
三、循环语句
3.1 while循环
3.1.1 while语句中的break和continue
3.2 for循环
3.2.1 语法
3.2.2 break和continue在for循环中
3.2.3 for语句的循环控制变量
建议:
3.2.4 一些for循环的变种
3.3 do...while()循环
3.3.1 do语句的语法:
3.3.2 执行流程
3.3.3 do语句的特点
3.3.4 do while循环中的break和continue
四、goto语句
今天的分享是C语言的分支和循环语句,下面我将带大家深入了解它们。
分支语句
if
switch
循环语句
while
for
do while
goto语句
C语句可分为以下五类:
1. 表达式语句
2. 函数调用语句
3. 控制语句
4. 复合语句
5. 空语句
这里我要介绍的的是控制语句。
控制语句用于控制程序的执行流程,以实现程序的各种结构方式,它们由特定的语句定义符组成,C语言有九种控制语句。
可分成以下三类:
1. 条件判断语句也叫分支语句:if语句、switch语句;
2. 循环执行语句:do while语句、while语句、for语句;
3. 转向语句:break语句、goto语句、continue语句、return语句。
if语句的语法结构是怎么样的呢?
语法结构:
if(表达式)
语句;
if(表达式)
语句1;
else
语句2;
//多分支
if(表达式1)
语句1;
else if(表达式2)
语句2;
else
语句3;
下面我们用具体的代码来演示一下:
#include
//代码1
int main()
{
int age = 0;
scanf("%d", &age);
if(age<18)
{
printf("未成年\n");
}
}
//代码2
#include
int main()
{
int age = 0;
scanf("%d", &age);
if(age<18)
{
printf("未成年\n");
}
else
{
printf("成年\n");
}
}
//代码3
#include
int main()
{
int age = 0;
scanf("%d", &age);
if(age<18)
{
printf("少年\n");
}
else if(age>=18 && age<30)
{
printf("青年\n");
}
else if(age>=30 && age<50)
{
printf("中年\n");
}
else if(age>=50 && age<80)
{
printf("老年\n");
}
else
{
printf("老寿星\n");
}
}
代码1打印结果:
代码2打印结果:
代码3打印结果:
if语句:
如果条件为真,则执行if语句块中的代码。
如果条件为假,则跳过if语句块,继续执行后续的代码。
在C语言中如何表示真假?
0表示假,非0表示真。
如果条件成立,要执行多条语句,怎应该使用代码块。
#include
int main()
{
if(表达式)
{
语句列表1;
}
else
{
语句列表2;
}
return 0;
}
这里的一对 { } 就是一个代码块。
if-else语句:
如果条件为真,则执行if语句块中的代码。
如果条件为假,则执行else语句块中的代码。
当你写了这个代码:
#include
int main()
{
int a = 0;
int b = 2;
if(a == 1)
if(b == 2)
printf("hehe\n");
else
printf("haha\n");
return 0;
}
改正:
//适当的使用{}可以使代码的逻辑更加清楚。
//代码风格很重要
#include
int main()
{
int a = 0;
int b = 2;
if(a == 1)
{
if(b == 2)
{
printf("hehe\n");
}
}
else
{
printf("haha\n");
}
return 0;
}
else的匹配:else是和它离的最近的if匹配的。
//代码1
if (condition) {
return x;
}
return y;
}
//代码2
if(condition)
{
return x;
}
else
{
return y;
}
//代码3
int num = 1;
if(num == 5)
{
printf("hehe\n");
}
//代码4
int num = 1;
if(5 == num)
{
printf("hehe\n");
}
代码2和代码4更好,逻辑更加清晰,不容易出错。
switch语句也是一种分支语句。
常常用于多分支的情况。
比如:
⚫️输入1,输出星期一
⚫️输入2,输出星期二
⚫️输入3,输出星期三
⚫️输入4,输出星期四
⚫️输入5,输出星期五
⚫️输入6,输出星期六
⚫️输入7,输出星期日
那我没写成 if...else if ...else if 的形式太复杂,那我们就得有不一样的语法形式。 这就是switch 语句。
switch(整型表达式)
{
语句项;
}
而语句项是什么呢?
//是一些case语句:
//如下:
case 整形常量表达式:
语句;
这里的整型常量表达式分为以下四种:
1.字面整数常量
2.枚举常量
3.宏定义
4.常量表达式
在switch语句中,我们没办法直接实现分支,搭配break使用才能实现真正的分支。
比如:
#include
int main()
{
int day = 0;
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;
}
return 0;
}
有时候我们的需求变了:
1. 输入1-5,输出的是“weekday”
2. 输入6-7,输出“weekend ”
所以我们的代码就应该这样实现了:
#include
//switch代码演示
int main()
{
int day = 0;
switch(day)
{
case 1:
case 2:
case 3:
case 4:
case 5:
printf("weekday\n");
break;
case 6:
case 7:
printf("weekend\n");
break;
}
return 0;
}
break语句的实际效果是把语句列表划分为不同的分支部分。
break的作用:
终止case分支:每个case标签后的代码块被执行后,如果没有使用break语句,程序将继续执行下一个case分支的代码。
跳出switch语句:使用break关键字可以跳出整个switch语句。
default情况下的break:在处理switch语句中的默认情况时,使用break可以结束分支的执行。
编程好习惯
在最后一个 case 语句的后面加上一条 break语句。
(之所以这么写是可以避免出现在以前的最后一个 case 语句后面忘了添加 break语句)。
default:
写在任何一个 case 标签可以出现的位置。
当 switch 表达式的值并不匹配所有 case 标签的值时,这个 default 子句后面的语句就会执行。 所以,每个switch语句中只能出现一条default子句。
但是它可以出现在语句列表的任何位置,而且语句流会像执行一个case标签一样执行default子句。
编程好习惯
在每个 switch 语句中都放一条default子句是个好习惯,甚至可以在后边再加一个 break 。
我们已经掌握了,if语句:
if(条件)
语句;
当条件满足的情况下,if语句后的语句执行,否则不执行。 但是这个语句只会执行一次。由于我们发现生活中很多的实际的例子是:同一件事情我们需要完成很多次。 那我们怎么做呢?
C语言中给我们引入了: while 语句,可以实现循环。
//while 语法结构
while(表达式)
循环语句;
while语句执行的流程:
比如我们实现:
//在屏幕上打印1-10的数字。
#include
int main()
{
int i = 1;
while(i<=10)
{
printf("%d ", i);
i = i+1;
}
return 0;
}
打印结果:
上面的代码已经帮我了解了 while 语句的基本语法,那我们再了解一下:
break介绍
//break 代码实例
#include
int main()
{
int i = 1;
while(i<=10)
{
if(i == 5)
break;
printf("%d ", i);
i = i+1;
}
return 0;
}
打印结果:
当满足条件i=5时,break使得while循环提前终止,同时break后面的语句也不再执行。
总结:
break在while循环中的作用:
其实在循环中只要遇到break,就停止后期的所有的循环,直接终止循环。 所以:while中的break是用于永久终止循环的。
continue介绍
//continue 代码实例1
#include
int main()
{
int i = 1;
while(i<=10)
{
if(i == 5)
continue;
printf("%d ", i);
i = i+1;
}
return 0;
}
打印结果:
i=5时跳过本次循环,此时i还是等于5 ,一直死循环,但不执行其他操作。
//continue 代码实例2
#include
int main()
{
int i = 1;
while (i <= 10)
{
i = i + 1;
if (i == 5)
continue;
printf("%d ", i);
}
return 0;
}
打印结果:
因为i=i+1在if前面,所以当i=5时,跳过printf这条语句,i=5进入循环后,执行i=i+1这条语句,此时i=6,以此类推,直到i=10进入循环,打印出11。
总结:
continue在while循环中的作用就是:
continue是用于终止本次循环的,也就是本次循环中continue后边的代码不会再执行, 而是直接跳转到while语句的判断部分。进行下一次循环的入口判断。
我们已经知道了while循环,但是我们为什么还要一个for循环呢?
首先来看看for循环的语法:
for(表达式1; 表达式2; 表达式3)
循环语句;
表达式1
表达式1为初始化部分,用于初始化循环变量的。
表达式2
表达式2为条件判断部分,用于判断循环时候终止。
表达式3
表达式3为调整部分,用于循环条件的调整。
实际的问题:
//使用for循环 在屏幕上打印1-10的数字。
#include
int main()
{
int i = 0;
//for(i=1/*初始化*/; i<=10/*判断部分*/; i++/*调整部分*/)
for(i=1; i<=10; i++)
{
printf("%d ", i);
}
return 0;
}
打印结果:
for循环的执行流程图:
现在我们对比一下for循环和while循环。
int i = 0;
//实现相同的功能,使用while
i=1;//初始化部分
while(i<=10)//判断部分
{
printf("hehe\n");
i = i+1;//调整部分
}
//实现相同的功能,使用for
for(i=1; i<=10; i++)
{
printf("hehe\n");
}
可以发现在while循环中依然存在循环的三个必须条件(即初始化部分,判断部分,调整部分),但是由于风格的问题使得三个部分很可能偏离较远,这样查找修改就不够集中和方便。所以,for循环的风格更胜一筹;for循环使用的频率也最高。
我们发现在for循环中也可以出现break和continue,他们的意义和在while循环中是一样的。
但是还是有些差异:
//代码1
#include
int main()
{
int i = 0;
for(i=1; i<=10; i++)
{
if(i == 5)
break;
printf("%d ",i);
}
return 0;
}
//代码2
#include
int main()
{
int i = 0;
for(i=1; i<=10; i++)
{
if(i == 5)
continue;
printf("%d ",i);
}
return 0;
}
代码1打印结果:
代码2打印结果:
建议:
1. 不可在for 循环体内修改循环变量,防止 for 循环失去控制。
2. 建议for语句的循环控制变量的取值采用“前闭后开区间”写法。
int i = 0;
//前闭后开的写法
for(i=0; i<10; i++)
{}
//两边都是闭区间
for(i=0; i<=9; i++)
{}
#include
int main()
{
//代码1
for(;;)
{
printf("hehe\n");
}
//for循环中的初始化部分,判断部分,调整部分是可以省略的,但是不建议初学时省略,容易导致问
题。
//代码2
int i = 0;
int j = 0;
//这里打印多少个hehe?
for(i=0; i<10; i++)
{
for(j=0; j<10; j++)
{
printf("hehe\n");
}
}
//代码3
int i = 0;
int j = 0;
//如果省略掉初始化部分,这里打印多少个hehe?
for(; i<10; i++)
{
for(; j<10; j++)
{
printf("hehe\n");
}
}
//代码4-使用多余一个变量控制循环
int x, y;
for (x = 0, y = 0; x<2 && y<5; ++x, y++)
{
printf("hehe\n");
}
return 0;
}
do
循环语句;
while(表达式);
循环至少执行一次,使用的场景有限,所以不是经常使用。
#include
int main()
{
int i = 10;
do
{
printf("%d\n", i);
}while(i<10);
return 0;
}
//代码1
#include
int main()
{
int i = 10;
do
{
if(5 == i)
break;
printf("%d\n", i);
}while(i<10);
return 0;
}
//代码2
#include
int main()
{
int i = 10;
do
{
if(5 == i)
continue;
printf("%d\n", i);
}while(i<10);
return 0;
}
C语言中提供了可以随意滥用的 goto语句和标记跳转的标号。
从理论上 goto语句是没有必要的,实践中没有goto语句也可以很容易的写出代码。
但是某些场合下goto语句还是用得着的,最常见的用法就是终止程序在某些深度嵌套的结构的处理过 程。
例如:一次跳出两层或多层循环。
多层循环这种情况使用break是达不到目的的。它只能从最内层循环退出到上一层的循环。
goto语言真正适合的场景如下:
for(...)
for(...)
{
for(...)
{
if(disaster)
goto error;
}
}
…
error:
if(disaster)
// 处理错误情况
goto
语句是一种控制流语句,用于将程序的执行跳转到代码的另一个位置。它允许程序员通过指定一个标签来指示程序跳转到标签所在的位置。在跳转到标签的位置后,程序将继续按顺序执行下去。
以下是一个使用goto
语句的示例代码:
#include
int main() {
int num = 0;
loop: // 标签
printf("%d ", num);
num++;
if (num < 10) {
goto loop; // 跳转到标签所在的位置
}
return 0;
}
上述代码中,goto
语句被用来跳转到loop
标签所在的位置,即在循环中打印从0到9的数字。请注意,过度使用goto
语句可能会导致代码可读性和维护性的降低,应谨慎使用。
打印结果:
下面是使用goto语句的一个例子,然后使用循环的实现方式替换goto语句:
一个关机程序
#include
#include
#include
int main()
{
char input[10] = {0};
system("shutdown -s -t 60");//关机
again:
printf("电脑将在1分钟内关机,如果输入:我是猪,就取消关机!\n请输入:>");
scanf("%s", input);
if(0 == strcmp(input, "我是猪"))
{
system("shutdown -a");//取消关机
}
else
{
goto again;
}
return 0;
}
而如果不适用goto语句,则可以使用循环:
#include
#include
#include
int main()
{
char input[10] = {0};
system("shutdown -s -t 60");//关机
while(1)
{
printf("电脑将在1分钟内关机,如果输入:我是猪,就取消关机!\n请输入:>");
scanf("%s", input);
if(0 == strcmp(input, "我是猪"))
{
system("shutdown -a");//取消关机
break;
}
}
return 0;
}
关于shutdown命令的扩展-(请点击此处) 关于shutdown命令的扩展-(请点击此处)
好了今天的分享就到这里,非常感谢你们抽出时间阅读我的博客文章。我希望这些内容能够让你们收获新的知识和启发。
如果你对文章中的任何观点或主题有疑问或意见,我非常欢迎你在评论区与我进行讨论。我相信通过相互交流,我们可以一起学习和成长。
希望我们能够在下一篇文章中再次相遇。祝大家生活愉快,事事顺心!