当前位置:网站首页>【C语言】分支和循环语句(上)
【C语言】分支和循环语句(上)
2022-07-03 00:22:00 【脑瓜子翁嗡】
文章目录
前言
这一篇主要讲分支和循环语句里面的分支语句,循环语句的讲解在下一篇博客里面讲解。
1.什么是语句?
- C语言是【结构化】的控制语句

- C语句可分为以下五类:
- 表达式语句
- 函数调用语句
- 控制语句
- 复合语句
- 空语句
- 控制语句用于控制程序的执行流程,以实现程序的各种结构方式,它们由特定的语句定义符组成,C语言有九种控制语句。
可分成以下三类:
- 条件判断语句也叫分支语句:if语句、switch语句;
- 循环执行语句:do while语句、while语句、for语句;
- 转向语句:break语句、goto语句、continue语句、return语句。
2.分支语句(选择结构)
2.1 if 语句
if 语句语法结构
如果表达式的结果为真,则语句执行。
在C语言中0表示假,非0表示真。
(1)
if(表达式)
语句;
(2)
if(表达式)
语句1;
else
语句2;
(3)多分支
if(表达式1)
语句1;
else if(表达式2)
语句2;
else
语句3;
- 示例代码1
#include <stdio.h>
int main()
{
int age = 0;
scanf("%d", &age);
if (age < 18)
{
printf("未成年\n");
}
return 0;
}

- 示例代码2
#include <stdio.h>
int main()
{
int age = 0;
scanf("%d", &age);
if (age < 18)
{
printf("未成年\n");
}
else
{
printf("成年\n");
}
return 0;
}

- 示例代码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");
}
return 0;
}

如果条件成立,要执行多条语句,应该怎么使用代码块?
if 和 else 都只能控制一条语句,有多条语句必须使用 { }。这里的一对{ }就是一个代码块
#include <stdio.h>
int main()
{
if (表达式)
{
语句列表1;
}
else
{
语句列表2;
}
return 0;
}
代码示例
#include <stdio.h>
int main()
{
int age = 10;
if (age < 18)
{
printf("未成年\n");
printf("不能饮酒\n");
}
else
{
printf("成年\n");
printf("打游戏\n");
}
return 0;
}

2.1.1 悬空else
看下面的代码,猜猜打印的结果是 hehe 还是 haha
#include <stdio.h>
int main()
{
int a = 0;
int b = 0;
if (a == 1)
if (b == 2)
printf("hehe\n");
else
printf("haha\n");
return 0;
}

分析:
看打印结果我们会发现打印结果不是 hehe 也不是haha,而是空的,我们回看这个代码的格式会让我们以为 else 是和第一个 if 匹配,但是 else是和他离得最近的 if 匹配的,所以 if(a==1)条件不成立,结果为假,不执行语句,结果为空。一个 if…else语句才是一条完整的语句。
改正:
//适当的使用{}可以使代码的逻辑更加清楚。
#include <stdio.h>
int main()
{
int a = 0;
int b = 0;
if (a == 1)
{
if (b == 2)
{
printf("hehe\n");
}
}
else
{
printf("haha\n");
}
return 0;
}

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)//这里如果不小心少写了一个等号编译器是不会报错的,当只有一个等号的时候是赋值的意思,因为num是一个变量的可以被重新赋值的,所以编译器不会警告。
{
printf("hehe\n");
}
代码4
int num = 1;
if(5 == num)//if(num == 5),如果这里只有一个等号,编译器会报错,我们把常量放在右边,是不可以把一个变量赋值给一个常量的,即使写错了编译器也会很快帮我们发现问题。
{
printf("hehe\n");
}
代码2和代码4更好,逻辑更加清晰,不容易出错。
2.1.3 练习
1.判断一个数是否是奇数
我们这里学习了 if 语句,我们就尝试使用 if 语句写代码。
#include <stdio.h>
int main()
{
int num = 0;
scanf("%d", &num);
if (num % 2 == 1)
printf("奇数\n");
else
printf("NO\n");
return 0;
}

2.输出1-100之间的奇数
我们这里需要使用循环语句,我们可以用while循环也可以用 for 循环。
//while 循环
#include <stdio.h>
int main()
{
int i = 0;
while (i <= 100)
{
if (i % 2 == 1)
printf("%d ", i);
i++;
}
return 0;
}
//for 循环
#include <stdio.h>
int main()
{
int i = 0;
for (i = 1; i <= 100; i++)
{
if (i % 2 == 1)
printf("%d ", i);
}
return 0;
}

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
在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-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;
}
return 0;
}

这里说明了 case 后面是可以不加 break ,没有 break 的时候会持续往下走。
break 语句 的实际效果是把语句列表分化为不同的分支部分。
编程好习惯
在最后一个 case 语句的后面加上一条 break语句。
(之所以这么写是可以避免出现在以前的最后一个 case 语句后面忘了添加 break语句)。
2.2.2 default 子句
default:
写在任何一个 case 标签可以出现的位置。
当 switch 表达式的值并不匹配所有 case 标签的值时,这个 default 子句后面的语句就会执行。
所以,每个switch语句中只能出现一条default子句。
但是它可以出现在语句列表的任何位置,而且语句流会像执行一个case标签一样执行default子句。
编程好习惯
在每个 switch 语句中都放一条default子句是个好习惯,甚至可以在后边再加一个 break 。
2.2.3 练习
这里我们做一道练习,看我们是否对switch掌握熟练了,读下面的代码,算出的 m,n的值是多少?
#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;
}

注意:
- switch 语句是可以嵌套使用的。
- switch 语句里面的 break 只会跳出自己所在的 switch,不是说一个 break 跳出所有的 switch 语句。
本章到这里就结束啦,如果有哪里写的不好的地方,请指正。
如果觉得不错并且对你有帮助的话请给个三连支持一下吧!
Fighting!!!
边栏推荐
- 【AutoSAR 十一 通信相关机制】
- Lu Zhe, chief scientist of Shiping information: building data and personnel centered security capabilities
- Two common methods and steps of character device registration
- Deep analysis of data storage in memory
- 【AutoSAR 十 IO架构】
- [IELTS reading] Wang Xiwei reading P1 (reading judgment question)
- How to find out the currently running version of Solr- How do I find out version of currently running Solr?
- 2022上半年值得被看见的10条文案,每一句都能带给你力量!
- 【AutoSAR 一 概述】
- Linux Software: how to install redis service
猜你喜欢
![[IELTS reading] Wang Xiwei reading P1 (reading judgment question)](/img/ee/540661fcb2cf1cf1eb15e2026c997a.png)
[IELTS reading] Wang Xiwei reading P1 (reading judgment question)
![[AUTOSAR eight OS]](/img/ac/fbc84c077ff9c94c840e1871171d19.png)
[AUTOSAR eight OS]

指针进阶(一)

【AutoSAR 十一 通信相关机制】
![[overview of AUTOSAR four BSW]](/img/19/c2273bbedb7f8d859e5a3805ed5740.png)
[overview of AUTOSAR four BSW]

Leetcode-2280: represents the minimum number of line segments of a line graph

The "2022 China Digital Office Market Research Report" can be downloaded to explain the 176.8 billion yuan market in detail

Shell 实现文件基本操作(sed-编辑、awk-匹配)

antv x6节点拖拽到画布上后的回调事件(踩大坑记录)

Web2.0的巨头纷纷布局VC,Tiger DAO VC或成抵达Web3捷径
随机推荐
Some introduction and precautions about XML
数学建模之线性规划(含MATLAB代码)
数组与集合性能比较
Leetcode 294. Flip game II (game theory)
Use Jenkins II job
Win10 can't be installed in many ways Problems with NET3.5
Sentry developer contribution Guide - configure pycharm
Deep analysis of data storage in memory
[IELTS reading] Wang Xiwei reading P1 (reading judgment question)
【爱死机】《吉巴罗》被忽略的细节
Vulkan-实践第一弹
Leetcode-241: designing priorities for operational expressions
[AUTOSAR five methodology]
Is there a free text to speech tool to help recommend?
[AUTOSAR II appl overview]
【AutoSAR 四 BSW概述】
Liad: the consumer end of micro LED products is first targeted at TVs above 100 inches. At this stage, it is still difficult to enter a smaller size
指针进阶(一)
How to systematically learn machine learning
AEM: Nanlin fan Ben et al. - plant rhizosphere growth promoting bacteria control soybean blight