目录
文章图片
前言
文章图片
补充
文章图片
分支语句
文章图片
if语句
文章图片
语法介绍
文章图片
悬空else
文章图片
if书写形式的对比
文章图片
小练习
文章图片
switch语句
文章图片
switch语句中的break
文章图片
default子句
文章图片
小练习
文章图片
循环
文章图片
while循环
文章图片
for循环
文章图片
语法介绍
文章图片
for语句中的break和continue
文章图片
for语句的循环控制变量
文章图片
一些for循环的变种
文章图片
一道笔试题
文章图片
do while循环
文章图片
do语句的语法
文章图片
执行流程
文章图片
do语句特点
【初阶C语言|对C语言控制语句的再认识(万字超详细讲解)】
文章图片
do while中的break和continue
文章图片
练习(小试牛刀)
文章图片
goto语句
文章图片
前言
从本篇开始,月亮将带着大家一起在初识C语言的基础之上,对C语言作出进一步的认识。只有一步一个脚印,我们才能掌握的更扎实,收获的更多!好的,今天我们就开始再认识一下控制语句吧!!!
文章图片
补充在我们开始之前我们应该知道下面这些内容,这些内容会有助于我们对语句的理解,我们可以看一看!!
C语句可分为以下五类:
1. 表达式语句
2. 函数调用语句
3. 控制语句
4. 复合语句
5. 空语句
本篇后面介绍的是控制语句。
控制语句用于控制程序的执行流程,以实现程序的各种结构方式,它们由特定的语句定义符组成,C语言有九种控制语句。
可分成以下三类:
1. 条件判断语句也叫分支语句:if语句、switch语句;
2. 循环执行语句:do while语句、while语句、for语句;
3. 转向语句:break语句、goto语句、continue语句、return语句。
通俗的讲,前两种也就是我们所说的分支语句和循环语句。
文章图片
分支语句
文章图片
if语句
文章图片
语法介绍
那if语句的语法结构是怎么样的呢?
语法结构如下:
语法结构:
if(表达式)
语句;
if(表达式)
语句1;
else
语句2;
//多分支
if(表达式1)
语句1;
else if(表达式2)
语句2;
else
语句3;
为了更清晰的认识,我们来进行一些演示的程序(从简单到复杂):
#include int main()
{
int age = 0;
scanf("%d", &age);
if (age < 18)
{
printf("未成年\n");
}
}
这时我们选择输入一个5,结果如下:
文章图片
是的,我们输入的5满足了if的条件,所以进入了if语句中打印了未成年的答案!
文章图片
但是这个程序有一点点小问题:当我们输入大于等于18的数字时,程序没有显示任何东西,这表明我们的程序还不够完善,所以我们做了进一步改进。
那我们再来看一个:
#include
int main()
{
int age = 0;
scanf("%d", &age);
if (age < 18)
{
printf("未成年\n");
}
else
{
printf("成年\n");
}
}
这是我们改进后的程序,我们运行一下:
文章图片
文章图片
我们可以清楚的看到,完善后的代码可以打印出满足相应条件的内容!!!
那如果我们想添加更多的内容怎么办呢?别急,先看下面这个程序
#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");
}
}
文章图片
这就用到了更多的elseif语句来提供我们所需要的条件。
文章图片
注意:
如果表达式的结果为真,则语句执行。
那么在C语言中如何表示真假?
0表示假,非0表示真。
如果条件成立,要执行多条语句,怎应该使用代码块?
#include
int main()
{
if(表达式)
{
语句列表1;
}
else
{
语句列表2;
}
return 0;
}
这里的一对 { } 就是一个代码块。
按照这个格式书写就可以解决这个问题啦!
悬空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;
}
你们猜一猜这个程序运行的结果是什么?是打印hehe嘛?答案是不是,它什么都没有打印。
文章图片
那么问题的原因在哪里呢?
原因在这里:else的匹配:else是和它离的最近的if匹配的。
当我们运行这个程序的时候,a=0没有满足对应的if条件,而程序中也没有a=0是可以执行的语句,所以什么都没有打印,而代码中后面的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;
}
运行结果:
文章图片
在这里我们可以看到对{}的使用,对于良好的代码习惯是多么的重要。所以我们要学习这种形式!
文章图片
文章图片
if书写形式的对比
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更好,逻辑更加清晰,不容易出错。
那就有人会问了,3和4有什么区别呢?3和4的效果在这里是一样的,但是实际意义是不一样的,3在这里的条件是判断5是不是等于num,而4判断的是num是不是等于5。有时候我们可能会漏写一个等号,那么就变成了赋值语句啦!!!如果是代码3所写的那样,编译器可能不会报错,这样你就发现不了错误了,而4的写法有效的避免了这种错误,并不会改变num的数值!!!
文章图片
小练习
1. 判断一个数是否为奇数
(奇数不能被2整除)
#include
int main()
{
//判断一个数是否为奇数
int num = 0;
scanf("%d", &num);
//判断 if (num % 2 == 1)
printf("奇数\n");
else
printf("no\n");
return 0;
}
2. 输出1-100之间的奇数
(借助循环和判断奇数的方法)
#include
//输出1-100之间的奇数
int main()
{
int i = 1;
while (i <= 100)
{
if (i % 2 == 1)
printf("%d ", i);
i++;
} return 0;
}
文章图片
文章图片
switch语句switch语句也是一种分支语句。
常常用于多分支的情况。
比如:
输入1,输出星期一
输入2,输出星期二
输入3,输出星期三
输入4,输出星期四
输入5,输出星期五
输入6,输出星期六
输入7,输出星期日
那我没写成 if...else if ...else if 的形式太复杂,那我们就得有不一样的语法形式。
这就是switch 语句。
switch(整型表达式)
{
语句项;
}
语句项是什么玩意???
是这个玩意哈哈哈
文章图片
//是一些case语句:
//如下:
case 整形常量表达式:
语句;
文章图片
switch语句中的break
在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;
}
只有使用了break我们才能够跳出这个语句,不然会一直按顺序执行下去的!
有时候我们的需求变了:
1. 输入1-5,输出的是“weekday”;
2. 输入6-7,输出“weekend”
所以我们的代码就应该这样实现了:
#include
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("选择错误\n");
break;
} return 0;
}
break语句的实际效果是把语句列表划分为不同的分支部分。
编程好习惯
在最后一个 case 语句的后面加上一条 break语句。
(之所以这么写是可以避免出现在以前的最后一个 case 语句后面忘了添加 break语句)。
文章图片
default子句
文章图片
如果表达的值与所有的case标签的值都不匹配怎么办?
其实也没什么,结构就是所有的语句都被跳过而已。
程序并不会终止,也不会报错,因为这种情况在C中并不认为是个错误。
但是,如果你并不想忽略不匹配所有标签的表达式的值时该怎么办呢?
你可以在语句列表中增加一条default子句,把下面的标签
default:
写在任何一个 case 标签可以出现的位置。
当 switch 表达式的值并不匹配所有 case 标签的值时,这个 default 子句后面的语句就会执行。
所以,每个switch语句中只能出现一条default子句。
但是它可以出现在语句列表的任何位置,而且语句流会像执行一个case标签一样执行default子句。
编程好习惯
在每个 switch 语句中都放一条default子句是个好习惯,甚至可以在后边再加一个 break 。
文章图片
小练习
大家伙可以试着敲一下这个程序并运行一下,并理解它的运行过程,可以借助一些调试噢!!!
#include int main()
{
int n = 1;
int m = 2;
switch (n)
{
case 1:m++;
case 2:n++;
case 3:
switch (n)
{//switch允许嵌套使用
case 1: n++;
case 2: m++;
n++;
break;
}
case 4:
m++;
break;
default:
break;
}
printf("m = %d, n = %d\n", m, n);
return 0;
}
文章图片
循环
我们已经掌握了,if语句
当条件满足的情况下,if语句后的语句执行,否则不执行。
但是这个语句只会执行一次。
由于我们发现生活中很多的实际的例子是:同一件事情我们需要完成很多次。
那我们怎么做呢?
C语言中给我们引入了: while 语句,可以实现循环。
文章图片
while循环
while语句的执行流程:
文章图片
比如我们实现:
在屏幕上打印1-10的数字。
#include
int main()
{
int i = 1;
while(i<=10)
{
printf("%d ", i);
i = i+1;
}
return 0;
}
文章图片
上面的代码已经帮我们了解了 while 语句的基本语法,那我们再了解一下下面这个内容!
文章图片
while语句中的break和continue
//break 代码实例
#include
int main()
{
int i = 1;
while (i <= 10)
{
if (i == 5)
break;
printf("%d ", i);
i = i + 1;
}
return 0;
}
文章图片
看看运行的结果和你想象的一样不一样??
文章图片
总结:
break在while循环中的作用:
其实在循环中只要遇到break,就停止后期的所有的循环,直接终止循环。
所以:while中的break是用于永久终止循环的。
//continue 代码实例1
#include
int main()
{
int i = 1;
while (i <= 10)
{
if (i == 5)
continue;
printf("%d ", i);
i = i + 1;
}
return 0;
}
文章图片
这个程序的结果我们可以看到,到5的时候开始死循环了,光标一直闪烁,但不打印,这表明了它一直在执行if中的continue,并没有执行后面的语句。
//continue 代码实例2
#include
int main()
{
int i = 1;
while (i <= 10)
{
i = i + 1;
if (i == 5)
continue;
printf("%d ", i);
}
return 0;
}
文章图片
这个为什么是这个结果,我们可以看到,对于i的改变的表达式放在了前面,这就表明了即便continue执行了,i的值也会改变,当i改变后continue就不再执行,便可以打印出后面的数字了!
总结:
continue在while循环中的作用就是:
continue是用于终止本次循环的,也就是本次循环中continue后边的代码不会再执行,
而是直接跳转到while语句的判断部分。进行下一次循环的入口判断。
再看几个代码:
//代码什么意思?
//代码1
#include
int main()
{
int ch = 0;
while ((ch = getchar()) != EOF)
putchar(ch);
return 0;
}
这里的代码适当的修改是可以用来清理缓冲区的.
//代码2
#include
int main()
{
char ch = '\0';
while ((ch = getchar()) != EOF)
{
if (ch < ‘0’ || ch > ‘9’)
continue;
putchar(ch);
}
return 0;
}
//这个代码的作用是:只打印数字字符,跳过其他字符的、
文章图片
for循环
我们已经知道了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循环和while循环
int i = 0;
//实现相同的功能,使用while
i=1;
//初始化部分
while(i<=10)//判断部分
{
printf("hehe\n");
i = i+1;
//调整部分
}
//实现相同的功能,使用while
for(i=1;
i<=10;
i++)
{
printf("hehe\n");
}
可以发现在while循环中依然存在循环的三个必须条件,但是由于风格的问题使得三个部分很可能偏离较
远,这样
查找修改就不够集中和方便。所以,for循环的风格更胜一筹;for循环使用的频率也最高。
文章图片
for语句中的break和continue
我们发现在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;
}
这两个和前面的while相似,只是在用法上略有不同。
文章图片
for语句的循环控制变量
建议:
1. 不可在for 循环体内修改循环变量,防止 for 循环失去控制。
2. 建议for语句的循环控制变量的取值采用“前闭后开区间”写法。
int i = 0;
//前闭后开的写法
for(i=0;
i<10;
i++)
{}
//两边都是闭区间
for(i=0;
i<=9;
i++)
{}
文章图片
一些for循环的变种
#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;
}
文章图片
一道笔试题
//请问循环要循环多少次?
#include
int main()
{
int i = 0;
int k = 0;
for(i =0,k=0;
k=0;
i++,k++)
k++;
return 0;
}
答案是 0次,因为k=0是循环终止,而本身k就为0,所以没有进入循环。
我们也可以用这个程序看看次数是否正确
#include
int main()
{
int i = 0;
int k = 0;
int c = 0;
//用c来计算次数
for (i = 0, k = 0;
k = 0;
i++, k++)
{
k++;
c++;
}
printf("%d\n", c);
return 0;
}
文章图片
没错吧!!!
文章图片
do while循环
文章图片
do语句的语法
do
循环语句;
while (表达式);
文章图片
执行流程
文章图片
文章图片
do语句特点
循环至少执行一次,使用的场景有限,所以不是经常使用。
如:
#include
int main()
{
int i = 10;
do
{
printf("%d\n", i);
} while (i < 10);
return 0;
}
文章图片
虽然while中条件没有满足,但是依然执行了一次
文章图片
do while中的break和continue
依然是上面的例子,这里把代码留给大家,就不多做解释了哈!
#include
int main()
{
int i = 10;
do
{
if (5 == i)
break;
printf("%d\n", i);
} while (i < 10);
return 0;
}
#include
int main()
{
int i = 10;
do
{
if (5 == i)
continue;
printf("%d\n", i);
} while (i < 10);
return 0;
}
文章图片
练习(小试牛刀)
1. 计算 n的阶乘。
2. 计算 1!+2!+3!+……+10!
3. 编写代码,演示多个字符从两端移动,向中间汇聚。
4. 编写代码实现,模拟用户登录情景,并且只能登录三次。(只允许输入三次密码,如果密码正确则
提示登录成,如果三次均输入错误,则退出程序。
参考代码:
前两个比较简单就不多说了,如果有什么问题可以及时和月亮说哈!后面两个提供了参考代码:
//代码1
//编写代码,演示多个字符从两端移动,向中间汇聚
#include
int main()
{
char arr1[] = "welcome to bit...";
char arr2[] = "#################";
int left = 0;
int right = strlen(arr1)-1;
printf("%s\n", arr2);
//while循环实现
while(left<=right)
{
Sleep(1000);
arr2[left] = arr1[left];
arr2[right] = arr1[right];
left++;
right--;
printf("%s\n", arr2);
}
//for循环实现
for (left=0, right=strlen(src)-1;
left <= right;
left++, right--)
{
Sleep(1000);
arr2[left] = arr1[left];
arr2[right] = arr1[right];
printf( "%s\n", target);
}
retutn 0;
}
//代码2
int main()
{
char psw[10] = "" ;
int i = 0;
int j = 0;
for (i = 0;
i < 3 ;
++i)
{
printf( "please input:");
scanf("%s", psw);
if (strcmp(psw, "password" ) == 0)
break;
}
if (i == 3)
printf("exit\n");
else
printf( "log in\n");
}
文章图片
goto语句
C语言中提供了可以随意滥用的 goto语句和标记跳转的标号。
从理论上 goto语句是没有必要的,实践中没有goto语句也可以很容易的写出代码。
但是某些场合下goto语句还是用得着的,最常见的用法就是终止程序在某些深度嵌套的结构
程。
例如:一次跳出两层或多层循环。
多层循环这种情况使用break是达不到目的的。它只能从最内层循环退出到上一层的循环。
goto语言真正适合的场景如下:
for(...)
for(...)
{
for(...)
{
if(disaster
goto error;
}
}
…
error:
if(disaster)
// 处理错误情况
下面是使用goto语句的一个例子,然后使用循环的实现方式替换goto语句:
一个关机程序
#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
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命令的扩展-(请点这里)
文章图片
https://baike.baidu.com/item/shutdown/10469108?fr=aladdin
今天的学习到这里就要结束了,希望大家可以学到很多东西,也希望大家多多支持和鼓励我!
你们的支持是我最大的动力,欢迎━(*`?′*)ノ亻!各位观众老爷来关注噢!不定时更新,欢迎━(*`?′*)ノ亻!来学习
文章图片
文章图片
文章图片
文章图片
推荐阅读
- 初识c语言系列|初识C语言系列-3-选择,循环和函数
- C语言作业|if语句等_作业
- 初识c语言系列|初识c语言系列-2-常,变量,字符(串),转义字符和注释
- python周边|pyinstaller打包exe文件的详细步骤及过程中遇到的问题
- android开发|多线程 handler 使用
- Rust|Rust安装(windows)
- 历史上的今天|【历史上的今天】5 月 15 日(Mozilla 发布 Rust;起点中文网成立;Windows 启动音乐设计者出生)
- 汇编|汇编基础-3
- python|Python-JSON应用json库