1. 什么是语句?
首先这个要提一下:C语言是结构化的程序设计语言分为三个结构
- 顺序结构
- 选择结构
- 循环结构
1.顺序结构
是按照代码的书写顺序从前到后执行的结构。是C语言最简单、最基本的结构。
如图:是一个直线运行的结构
2.选择结构
选择结构用于判断给定的条件,根据判断的结果判断某些条件,根据判断的结果来控制程序的流程
如图:是一个分支运行的结构,分支语句有if和switch
3.循环结构
循环执行是循环结构的核心,表现为反复执行一个或一组操作。在编程中,如果想要从数据处理中发现循环执行,就要分析程序的执行结果与数据的处理过程。
如图:是一个循环不断运行的结构,循环语句有while,for和do while
我们今天就是围绕选择结构和循环结构展开的
C语句可分为以下五类:
1. 表达式语句
表达式语句,C程序设计语言的表达式语句由表达式加上分号“;”组成。例如: x=y+z;赋值语句;
2. 函数调用语句
函数调用语句由函数名、函数参数加上分号“;”组成。其一般形式为: sum(int a,int b);
3. 控制语句
控制语句即用来实现对程序流程的选择、循环、转向和返回等进行控制。C语言中共有9种控制语句,包括32个关键字,可以分为”选择语句“,”循环语句“,”转向语句“,”返回语句“四类。
可分成以下三类: 1. 条件判断语句也叫分支语句:if语句、switch语句; 2. 循环执行语句:do while语句、while语句、for语句; 3. 转向语句:break语句、goto语句、continue语句、return语句。
4. 复合语句
复合语句,是一个语言学领域术语,即把多个语句用括号{}括起来组成的一个语句。
5. 空语句
空语句是一个程序中的语言,是仅由分号组成,不执行任何的操作。
2. 分支语句(选择结构)
如果你好好打代码,毕业时拿一个好offer,走上人生巅峰。 如果你不学习,毕业等于失业,回家种地。 这就是选择(分支)!

2.1 if语句
if 语句的实现有好几种形式,我们逐一给大家介绍一下。
语法结构:
if(表达式)
语句;
if(表达式)
语句1;
else
语句2;
//多分支
if(表达式1)
语句1;
else if(表达式2)
语句2;
else
语句3;
先上代码更好理解
#include <stdio.h>
//代码1
int main()
{
int age = 0;
scanf("%d", &age);
if(age<18)
{
printf("未成年\n");
}
}
代码意思是如果if成立:(age<18)判断为Turn,就打印“未成年”

输入17,便会打印未成年
我们再将代码升级一下,让判断除了18以下其他的数字
//代码2
#include <stdio.h>
int main()
{
int age = 0;
scanf("%d", &age);
if(age<18)
{
printf("未成年\n");
}
else
{
printf("成年\n");
}
}
代码的意思就是相比与代码一如果输入除了18以下的数字,就会打印“成年”

输入20,打印成年
我们再再将代码细分一下
//代码3
#include <stdio.h>
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");
}
}
再每次判断不同的数字时还会有不同的分支结果
例如
17
少年
20
青年
35
中年
50
老年
100
老寿星
这样,就是实现了不同的分支结果
当然,上面的代码大家看了以后觉得要是把else if换成if也行阿,也能照样执行呀,为什么还要这样子麻烦多写一个else if?
确实没错,但是,我们的else if语句判断是执行为真后就不会继续往下执行了(例如输入18输出完青年后,就不会继续往下判断了),而if语句会每一步都执行直到语句结束,这样else if语句就有可能可以提升效率。为什么这里要提到是有可能,因为else if语句也有可能全部执行为false,而走到语句else语句(例如输入的是80及以上)
还有一点需要注意
在if语句或else if语句后面务必加上大括号
如果我们不加入,C语言会默认判断下面的第一句为执行内容
因为第二句算是循序结构中的普通语句,与if语句没有关系
2.1.1 悬空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;
}
答案:
没错就是上面都不输出,因为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语句后面一定要加中括号。
2.1.2 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更好,逻辑更加清晰,不容易出错。
2.2 switch语句
switch语句也是一种分支语句。 常常用于多分支的情况。

比如
输入1,输出星期一
输入2,输出星期二
输入3,输出星期三
输入4,输出星期四
输入5,输出星期五
输入6,输出星期六
输入7,输出星期日
那我没写成 if...else if ...else if 的形式太复杂,那我们就得有不一样的语法形式。
这就是switch 语句。
switch(整型表达式)
{
语句项;
}
而上面的语句项是什么呢?
//是一些case语句:
//如下:
case 整形常量表达式:
语句;
2.2.1 在switch语句中的 break
还不太明白的话直接上代码
#include <stdio.h>
int main()
{
int day = 0;
scanf("%d", &day);
switch (day)
{
case 1:
printf("星期一\n");
case 2:
printf("星期二\n");
case 3:
printf("星期三\n");
case 4:
printf("星期四\n");
case 5:
printf("星期五\n");
case 6:
printf("星期六\n");
case 7:
printf("星期天\n");
}
return 0;
}
但是还有点问题,我们输入来验证一下
1
星期一
星期二
星期三
星期四
星期五
星期六
星期天
5
星期五
星期六
星期天
我们发现不对阿,应该只输出对应数字的星期,不应该输入那么多。
所以我们应该补充上break语句来中断。
在switch语句中,我们没办法直接实现分支,搭配break使用才能实现真正的分支。
#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;
}
return 0;
}
有时候我们的需求变了:
1. 输入1-5,输出的是“weekday”;
2. 输入6-7,输出“weekend”
所以我们的代码就应该这样实现了:
#include <stdio.h>
//switch代码演示
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;
}
return 0;
}
输入:1-5
输出:weekday
输入:6-7
输出:weekend
break语句 的实际效果是把语句列表划分为不同的分支部分
分享一个编程好习惯
在最后一个 case 语句的后面加上一条 break语句。
(之所以这么写是可以避免出现在以前的最后一个 case 语句后面忘了添加 break语句)。
2.2.2 default子句
如果表达的值与所有的case标签的值都不匹配怎么办?
其实也没什么,结构就是所有的语句都被跳过而已。
程序并不会终止,也不会报错,因为这种情况在C中并不认为是个错误。
但是,如果你并不想忽略不匹配所有标签的表达式的值时该怎么办呢?
你可以在语句列表中增加一条default子句,把下面的标签
default:
写在任何一个 case 标签可以出现的位置。
当 switch 表达式的值并不匹配所有 case 标签的值时,这个 default 子句后面的语句就会执行。
所以,每个switch语句中只能出现一条default子句。
但是它可以出现在语句列表的任何位置,而且语句流会像执行一个case标签一样执行default子句。
编程好习惯
在每个 switch 语句中都放一条default子句是个好习惯,甚至可以在后边再加一个 break 。
2.2.3 练习
#include <stdio.h>
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;
}
m = 5, n = 3
3. 循环语句
- while
- for
- do while
3.1 while循环
我们已经掌握了,if语句:
if(条件)
语句;
当条件满足的情况下,if语句后的语句执行,否则不执行。
但是这个语句只会执行一次。
由于我们发现生活中很多的实际的例子是:同一件事情我们需要完成很多次。
那我们怎么做呢? C语言中给我们引入了: while 语句,可以实现循环。
//while 语法结构 while(表达式) 循环语句;
while语句执行的流程:

比如我们实现:
在屏幕上打印1-10的数字。
#include <stdio.h>
int main()
{
int i = 1;
while(i<=10)
{
printf("%d ", i);
i = i+1;
}
return 0;
}
上面的代码已经帮我了解了 while 语句的基本语法,可能大家也对上图的continue和break有疑问,那我们再了解一下:
3.1.1 while语句中的break和continue
break介绍
//break 代码实例
#include <stdio.h>
int main()
{
int i = 1;
while(i<=10)
{
if(i == 5)
break;
printf("%d ", i);
i = i+1;
}
return 0;
}
这里代码输出的结果是什么?
1 2 3 4
1 2 3 4 5
1 2 3 4 5 6 7 8 9 10
1 2 3 4 6 7 8 9 10
总结:
其实在循环中只要遇到break,就停止后期的所有的循环,直接终止循环。
所以:while中的break是用于永久终止循环的。
continue介绍
//continue 代码实例1
#include <stdio.h>
int main()
{
int i = 1;
while(i<=10)
{
if(i == 5)
continue;
printf("%d ", i);
i = i+1;
}
return 0;
}
这里代码输出的结果是什么?
1 2 3 4
1 2 3 4 5
1 2 3 4 5 6 7 8 9 10
1 2 3 4 6 7 8 9 10
答案:
1 2 3 4
//continue 代码实例2
#include <stdio.h>
int main()
{
int i = 1;
while(i<=10)
{
i = i+1;
if(i == 5)
continue;
printf("%d ", i);
}
return 0;
}
这里代码输出的结果是什么?
1 2 3 4
1 2 3 4 5
1 2 3 4 5 6 7 8 9 10
1 2 3 4 6 7 8 9 10
2 3 4 6 7 8 9 10
答案:
2 3 4 6 7 8 9 10
这边要注意:i=i+1是在打印之前的,所以第一个输出的i是2。
总结:
continue在while循环中的作用就是:
continue是用于终止本次循环的,也就是本次循环中continue后边的代码不会再执行, 而是直接跳转到while语句的判断部分。进行下一次循环的入口判断。
再看几个代码:
//代码什么意思?
//代码1
#include <stdio.h>
int main()
{
int ch = 0;
while ((ch = getchar()) != EOF)
putchar(ch);
return 0;
}
要理解这个代码,先介绍一下这个新函数:getchar()
从名字上我们可以猜出来这个是用来干什么的,就是用来读取一个字符
当我们不太理解的时候,可以在C语言官网去查看一下,附上链接:
int getchar ( void );从上面可以看出getchar是不需要参数的(void),表示无参;
但是他返回的是int 返回的是这个字符的ASCLL值。
On success, the character read is returned (promoted to an int value).
The return type is int to accommodate for the special value EOF, which indicates failure:
If the standard input was at the end-of-file, the function returns EOF and sets the eof indicator (feof) of stdin.
If some other reading error happens, the function also returns EOF, but sets its error indicator (ferror) instead.当他没有读到字符(读取失败),返回的就是EOF。
所以这个代码的意思就是
//代码什么意思?
//代码1
#include <stdio.h>
int main()
{
int ch = 0;
while ((ch = getchar()) != EOF)
putchar(ch);
return 0;
}
输出你刚刚输入的字符,直到没有读取出字符(ctrl+c退出)
输入:A
输出:A
输入:B
输出:B
输入:1
输出:1
输入:2
输出:2
补充一下
EOF-end of file 表示文件结束标志
C语言定义EOF本质是-1,将光标移到EOF旁边可以看到

#define EOF (-1)
在此函数读取失败之后,就返回EOF。
学习这个知识点后我们再来看一下实现输入密码的代码并且确认的代码。
int main()
{
int password[20] = { 0 };
printf("请输入密码:");
scanf("%s", password);
char input = 0;
printf("请确认密码输入Y/N:\n");
scanf("%c", &input);
if ('Y' == input)
{
printf("输入成功");
}
else
{
printf("输入失败");
}
return 0;
}
我们运行后发现:程序没有等我们二次输入就执行了if的语句
请输入密码:123456
请确认密码输入Y/N:
输入失败
这是因为我们在输入的时候程序会有一个输入缓冲区,用来从键盘输入数据。

当我们使用scanf或者getchar的时候,第一次输入的时候会存入这次输入的数据。
(输入:123456+回车键)
存入的就是以下数据

scanf会拿取‘/n’之前的数据。
scanf("%s", password);
这时候123456就被拿走了(给到了password数组里面),只剩下一个'\n'。

而第二次我们输入,scanf就会先去输入缓冲区查看数据,发现只有一个'\n',是上一次输入留下的,所以就误以为是你输入的,也拿走给到input里去了。
scanf("%c", &input);

所以我们要把‘\n’处理掉。代码修改为:
int main()
{
int password[20] = { 0 };
printf("请输入密码:");
scanf("%s", password);
char input = 0;
printf("请确认密码输入Y/N:\n");
getchar();
scanf("%c", &input);
if ('Y' == input)
{
printf("输入成功");
}
else
{
printf("输入失败");
}
return 0;
}
请输入密码:123456
请确认密码输入Y/N:
Y
输入成功
但是这样写代码也有局限性,只能清理掉一个数据,如果要清理掉缓冲区所有的数据,代码就改成:
int main()
{
int password[20] = { 0 };
printf("请输入密码:");
scanf("%s", password);
char input = 0;
printf("请确认密码输入Y/N:\n");
while (getchar() != '\n')
{
;
}
scanf("%c", &input);
if ('Y' == input)
{
printf("输入成功");
}
else
{
printf("输入失败");
}
return 0;
}
再来一个代码
//代码2
#include <stdio.h>
int main()
{
char ch = '\0';
while ((ch = getchar()) != EOF)
{
if (ch < '0'|| ch > '9')
continue;
putchar(ch);
}
return 0;
}
//这个代码的作用是:只打印数字字符,跳过其他字符的、
本文详细介绍了C语言中的选择结构(包括if语句和switch语句)和循环结构(while、for和do...while),讲解了各种结构的语法、用法以及break和continue在循环中的作用。同时,文中通过示例代码说明了如何处理输入输出、控制流程以及处理输入缓冲区的问题。







&spm=1001.2101.3001.5002&articleId=130298098&d=1&t=3&u=3a380d575f9447db8eb5c569152a2f91)
287

被折叠的 条评论
为什么被折叠?



