万字C语言之分支语句和循环语句

前言:

📕作者简介:热爱编程的小七,致力于C、Java、Python等多编程语言,热爱编程和长板的运动少年!

📘相关专栏Java基础语法,JavaEE初阶,数据库,数据结构和算法系列等,大家有兴趣的可以看一看。

😇😇😇有兴趣的话关注博主一起学习,一起进步吧!

一、什么是语句

C语句可分为以下五类:

1. 表达式语句

2. 函数调用语句

3. 控制语句

4. 复合语句

5. 空语句

控制语句用于控制程序的执行流程,以实现程序的各种结构方式,它们由特定的语句定义符组成,C语言有九种控制语句。

可分成以下三类: 1. 条件判断语句也叫分支语句:if语句、switch语句; 2. 循环执行语句:do while语句、while语句、for语句; 3. 转向语句:break语句、goto语句、continue语句、return语句。


二、分支语句(选择结构)

2.1 if语句

语法结构:
//1.第一种表示
if(表达式)语句;
if(表达式)语句1;
else语句2;
//2.第二种方式(多分支)
if(表达式1)语句1;
else if(表达式2)语句2;
else语句3;

在C语言中:0表示假,非0表示真。

#include<stdio.h>
int main()
{int age=0;printf("请输入年龄:\n");scanf("%d",&age);if(age>=0 && age<18){printf("未成年\n!");}else if(age>=18 && age <=35){printf("中年人!\n");}else if(age>35 && age< 80){printf("老年人!\n");}else{printf("老不死\n!");}return 0;
}
//执行结果:
[root@VM-16-7-centos Day909]# ./test
请输入年龄:
44
老年人!
[root@VM-16-7-centos Day909]# ./test
请输入年龄:
15
未成年
![root@VM-16-7-centos Day909]# ./test
请输入年龄:
99
老不死

 2.1.1悬空else

#include <stdio.h>
int main()
{int a = 0;int b = 2;if (a == 1)if (b == 2)printf("hehe\n");elseprintf("haha\n");return 0;
}
#include <stdio.h>
int main()
{int a = 0;int b = 2;if (a == 1)if (b == 2)printf("hehe\n");elseprintf("haha\n");return 0;
}
[root@VM-16-7-centos Day909]# ./test
[root@VM-16-7-centos Day909]# 

总结:代码风格很重要,我们可以使用适当的{}使我们的逻辑更加清楚。

#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的匹配:else是和它离的最近的if匹配的。

2.1.2if书写形式的对比

//代码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.1.3练习

1. 判断一个数是否为奇数

#include<stdio.h>
int main()
{printf("请输入一个整数:\n");int num=0;scanf("%d",&num);if(num%2==0){printf("这是一个偶数!\n");}else{printf("这是一个奇数!\n");}return 0;
}[root@VM-16-7-centos Day909]# ./test1
请输入一个整数:
7
这是一个奇数!
[root@VM-16-7-centos Day909]# ./test1
请输入一个整数:
8
这是一个偶数!

2. 输出1-100之间的奇数

#include<stdio.h>
int main()
{//输出1-100之间的奇数for(int i=1;i<=100;1++){if(i % 2==1){pritnf("%d ",i);}}return 0;
}[root@VM-16-7-centos Day909]# ./test1
1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39 41 43 45 47 49 51 53 55 57 59 61 63 65 67 69 71 73 75 77 79 81 83 85 87 89 91 93 95 97 99 [root@VM-16-7-centos Day909]# 

2.2switch语句

switch语句也是一种分支语句。

比如:

输入1,输出星期一

输入2,输出星期二

输入3,输出星期三

输入4,输出星期四

输入5,输出星期五

输入6,输出星期六

输入7,输出星期日

switch(整型表达式)
{语句项;
}

 而语句项是什么呢?

//是一些case语句:
//如下:
case 整形常量表达式:语句;

2.2.1在switch语句中的 break

在switch语句中,我们没办法直接实现分支,搭配break使用才能实现真正的分支。

#include<stdio.h>
int main()
{printf("请输入:\n");int num=0;scanf("%d",&num);switch(num){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;default:printf("您的输入有误,请重试\n");break;}return 0;
}[root@VM-16-7-centos Day909]# ./test1
请输入:
1
星期一
[root@VM-16-7-centos Day909]# ./test1
请输入:
5
星期五
[root@VM-16-7-centos Day909]# ./test1
请输入:
8
您的输入有误,请重试

有时候我们的需求变了:

  1. 输入1-5,输出的是“weekday”;

  2. 输入6-7,输出“weekend”

#include<stdio.h>
int main()
{printf("请输入:\n");int num=0;scanf("%d",&num);switch(num){case 1:case 2:case 3:case 4:case 5:printf("工作日\n");break;case 6:case 7:printf("工作日\n");break;default:printf("您的输入有误,请重试\n");break;}return 0;
}[root@VM-16-7-centos Day909]# ./test1
请输入:
4
工作日
[root@VM-16-7-centos Day909]# ./test1
请输入:
6
工作日

break语句的实际效果是把语句列表划分为不同的分支部分。

编程好习惯:

一般情况下:在最后一个 case 语句的后面加上一条 break语句。

实际根据情况而选择是否添加break。

2.2.2default子句

如果表达的值与所有的case标签的值都不匹配怎么办?其实也没什么,结构就是所有的语句都被跳过而已。

程序并不会终止,也不会报错,因为这种情况在C中并不认为是个错误。但是,如果你并不想忽略不匹配所有标签的表达式的值时该怎么办呢?你可以在语句列表中增加一条default子句,把下面的标签default:写在任何一个case 标签可以出现的位置。当 switch 表达式的值并不匹配所有case 标签的值时,这个default 子句后面的语句就会执行。所以,每个switch语句中只能出现一条default子句。但是它可以出现在语句列表的任何位置,而且语句流会像执行一个case标签一样执行default子句。

在每个 switch 语句中都放一条default子句是个好习惯,甚至可以在后边再加一个 break 。

2.3循环语句

  • while

  • for

  • do while

2.3.1while循环

应用场景:同一件事情我们需要完成很多次。

//while 语法结构
while(表达式)循环语句;

练习:在屏幕上打印1-10的数字。

#include<stdio.h>
int main()
{int i=0;for(i=0;i<10;i++){printf("%d ",i);}printf("\n");return 0;
}[root@VM-16-7-centos Day909]# ./test1
0 1 2 3 4 5 6 7 8 9

2.3.1.1while语句中的break和continue

break介绍:

#include<stdio.h>
int main()
{int i=0;while(i<10){if(i==5){break;}printf("%d ",i);i++;}printf("\n");return 0;
}
//当i等于5的时候退出循环,不再进行接下来的操作
[root@VM-16-7-centos Day909]# ./test1
0 1 2 3 4

总结:break在while循环中的作用:

其实在循环中只要遇到break,就停止后期的所有的循环,直接终止循环。

所以:while中的break是用于永久终止循环的。

continue介绍:

#include<stdio.h>
int main()
{int i=0;while(i<10){if(i==5){continue;}i++;printf("%d ",i);}printf("\n");return 0;
}
//当i==5的时候,跳过本次循环进入下一次循环。
//执行结果如下:
[root@VM-16-7-centos Day909]# ./test1
0 1 2 3 4 6 7 8 9

continue在while循环中的作用就是:

continue是用于终止本次循环的,也就是本次循环中continue后边的代码不会再执行,

而是直接跳转到while语句的判断部分。进行下一次循环的入口判断。

2.3.1.2练习

//代码1
#include <stdio.h>
int main()
{int ch = 0;while ((ch = getchar()) != EOF)putchar(ch);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;
}
//这个代码的作用是:只打印数字字符,跳过其他字符的、

2.3.2for循环

for(表达式1; 表达式2; 表达式3)循环语句;

表达式1为初始化部分,用于初始化循环变量的。

表达式2为条件判断部分,用于判断循环时候终止。

表达式3为调整部分,用于循环条件的调整。

#include <stdio.h>
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循环使用的频率也最高。

2.3.2.1break和continue在for循环中

//代码1
#include <stdio.h>
int main()
{int i = 0;for (i = 1; i <= 10; i++){if (i == 5)break;printf("%d ", i);}return 0;
}
//代码2
#include <stdio.h>
int main()
{int i = 0;for (i = 1; i <= 10; i++){if (i == 5)continue;printf("%d ", i);}return 0;
}

2.3.2.2for语句的循环控制变量

  1. 不可在for 循环体内修改循环变量,防止 for 循环失去控制。

  2. 建议for语句的循环控制变量的取值采用“前闭后开区间”写法。

//同样都是进行十次循环
int i = 0;
//前闭后开的写法
for (i = 0; i < 10; i++)
{
}
//两边都是闭区间
for (i = 0; i <= 9; i++)
{
}

2.3.2.3一些for循环的变种

int main()
{//代码1for (;;){printf("hehe\n");}//for循环中的初始化部分,判断部分,调整部分是可以省略的,但是不建议初学时省略,容易导致问题。//代码2int i = 0;int j = 0;//这里打印多少个hehe?for (i = 0; i < 10; i++){for (j = 0; j < 10; j++){printf("hehe\n");}}//代码3int 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;
}

2.3.3do...while()循环

do语句的语法:

do循环语句;
while(表达式);

执行流程:

2.3.3.1do语句的特点

循环至少执行一次,使用的场景有限,所以不是经常使用。 

#include <stdio.h>
int main()
{int i = 10;do{printf("%d\n", i);} while (i < 10);return 0;
}
//输出结果:10

2.3.3.2do while循环中的break和continue

#include <stdio.h>
int main()
{int i = 10;do{if (5 == i)break;printf("%d\n", i);} while (i < 10);return 0;
}
#include <stdio.h>
int main()
{int i = 10;do{if (5 == i)continue;printf("%d\n", i);} while (i < 10);return 0;
}

2.4练习

2.4.1编写代码,演示多个字符从两端移动,向中间汇聚。

#include <stdio.h>
#include <string.h>
#include <windows.h>//sleep()函数
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.4.2编写代码实现,模拟用户登录情景,并且只能登录三次。

//代码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");elseprintf("log in\n");
}

2.4.3猜数字游戏实现
 

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void menu()
{printf("**********************************\n");printf("*********** 1.play **********\n");printf("*********** 0.exit **********\n");printf("**********************************\n");
}
//RAND_MAX--rand函数能返回随机数的最大值。
void game()
{int random_num = rand() % 100 + 1;int input = 0;while (1){printf("请输入猜的数字>:");scanf("%d", &input);if (input > random_num){printf("猜大了\n");}else if (input < random_num){printf("猜小了\n");}else{printf("恭喜你,猜对了\n");break;}}
}
int main()
{int input = 0;srand((unsigned)time(NULL));do{menu();printf("请选择>:");scanf("%d", &input);switch (input){case 1:game();break; case 0:break;default:printf("选择错误,请重新输入!\n");break;}} while (input);return 0;
}

2.5goto语句

C语言中提供了可以随意滥用的 goto语句和标记跳转的标号。

从理论上 goto语句是没有必要的,实践中没有goto语句也可以很容易的写出代码。

但是某些场合下goto语句还是用得着的,最常见的用法就是终止程序在某些深度嵌套的结构的处理过程。例如:一次跳出两层或多层循环。多层循环这种情况使用break是达不到目的的。它只能从最内层循环退出到上一层的循环。

goto语言真正适合的场景如下:
for (...)
for (...)
{for (...){if (disaster)goto error;}
}
…
error :
if (disaster)
// 处理错误情况

一个关机程序:

#include <stdio.h>
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 <stdio.h>
#include <stdlib.h>
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/%E8%87%AA%E5%8A%A8%E5%85%B3%E6%9C%BA/7875386?fr=aladdin&fromtitle=shutdown&fromid=10469108

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/126783.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

react-native实现 TextInput 键盘显示搜索按钮并触发回调

<TextInput returnKeyType"search"returnKeyLabel"搜索"onSubmitEditing{e > {toSearch(keyword);}} /><SearchBarref{serachBarEl}placeholder"请输入"onChangeText{handleChangeSearch}value{search}onSubmitEditing{handleSearch…

react16之前diff算法的理解和总结

此篇文章所讨论的是 React 16 以前的 Diff 算法。而 React 16 启用了全新的架构 Fiber&#xff0c;相应的 Diff 算法也有所改变&#xff0c;本片不详细讨论Fiber。 fiber架构是为了支持react进行可中断渲染&#xff0c;降低卡顿&#xff0c;提升流畅度。 react16之前的版本&…

131.【MySQL_基础篇】

MySQL_基础篇 (一)、MySQL 介绍1.MySQL三大阶段(1).基础篇(2).进阶篇(3).运维篇 2.MySQL 概念3.数据模型(1).关系型数据库(RDBMS) 4.数据库三大范式 (二)、SQL 编程语言1.SQL通用语法2.SQL 四大分类3.DDL (数据定义语言)(1).数据库操作 ->(增删改查)(2).表操作 -> (增删改…

IDEA2023隐藏.idea和.iml文件

IDEA2023隐藏.idea和.iml文件 1. 打开file -> setting,快捷键CtrlAlts2. Editor -> File types3. 点击右侧Ignore files and folders一栏4. 添加需要忽略的文件5. 最重要一步 IDEA新建项目会自动生成一个.idea文件夹和.iml文件&#xff0c;开发中不需要对这两个文件修改&…

LeetCode 92. Reverse Linked List II【链表,头插法】中等

本文属于「征服LeetCode」系列文章之一&#xff0c;这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁&#xff0c;本系列将至少持续到刷完所有无锁题之日为止&#xff1b;由于LeetCode还在不断地创建新题&#xff0c;本系列的终止日期可能是永远。在这一系列刷题文章…

react使用hook封装一个tab组件

目录 react使用hook封装一个tab组件Tabbar.jsx使用组件效果 react使用hook封装一个tab组件 Tabbar.jsx import PropsTypes from "prop-types"; import React, { useEffect, useState } from react; export default function Tabbar(props) {const { tabData , cur…

Kotlin File writeText appendText appendBytes readBytes readText

Kotlin File writeText appendText appendBytes readBytes readText import java.io.Filefun main(args: Array<String>) {val filePath "./myfile.txt"val file File(filePath)file.writeText("hello,") //如果原有文件有内容&#xff0c;将完全覆…

【Maven教程】(四)坐标与依赖:坐标概念,依赖配置、范围、传递性和最佳实践 ~

Maven 坐标与依赖 1️⃣ 什么是Maven 坐标2️⃣ 坐标详解3️⃣ 依赖的配置4️⃣ 依赖范围5️⃣ 传递性依赖6️⃣ 依赖调解7️⃣ 可选依赖8️⃣ 最佳实践8.1 排除依赖8.2 归类依赖8.3 优化依赖 &#x1f33e; 总结 正如前面文章所述&#xff0c;Maven 的一大功能是管理项目依赖…

sonarqube版本升级

官方文档&#xff1a;Upgrade guide 步骤1、停止原有sonarqube服务&#xff0c;如果是docker部署的直接停掉容器并删除 步骤2、部署最新版sonarqube&#xff0c;保留原有配置 步骤3、访问sonarqube web 显示维护中&#xff0c;根据官方给出的升级方法&#xff0c;在sonarqub…

学习笔记|小数点控制原理|数码管动态显示|段码跟位码|STC32G单片机视频开发教程(冲哥)|第十集:数码管动态显示

文章目录 1.数码管动态刷新的原理2.动态刷新原理3.8位数码管同时点亮新建一个数组选择每个位需要显示的内容实战小练&#xff1a;简易10秒免单计数器将刷新动作写成函数 课后练习: 1.数码管动态刷新的原理 上述图片引用自&#xff1a;51单片机初学2-数码管动态扫描 用一排端口来…

mysql 大表如何ddl

大家好&#xff0c;我是蓝胖子&#xff0c;mysql对大表(千万级数据)的ddl语句&#xff0c;在生产上执行时一定要千万小心&#xff0c;一不小心就有可能造成业务阻塞&#xff0c;数据库io和cpu飙高的情况。今天我们就来看看如何针对大表执行ddl语句。 通过这篇文章&#xff0c;…

推荐一款程序员截图神器!

快来看一下程序员必备的一款截图工具 今天就来和大家说一下作为程序员必备截图神器&#xff0c;几乎每一个程序员都会设置开机自启&#xff0c;因为这个截图功能太太太好用了&#xff01;&#xff01;&#xff01;只要你在键盘上按下F1就可以轻松截取整个屏幕&#xff0c;然后…

OpenHarmony:如何使用HDF驱动控制LED灯

一、程序简介 该程序是基于OpenHarmony标准系统编写的基础外设类&#xff1a;RGB LED。 目前已在凌蒙派-RK3568开发板跑通。详细资料请参考官网&#xff1a;https://gitee.com/Lockzhiner-Electronics/lockzhiner-rk3568-openharmony/tree/master/samples/b02_hdf_rgb_led。 …

【【STM32--28--IO引脚的复用功能】】

STM32–28–IO引脚的复用功能 STM32的IO复用功能 何为复用? 我们先了解一下何为通用 IO端口的输入或输出是由GPIO外设控制&#xff0c;我们称之为通用 复用&#xff1a; IO端口的输入或者是输出是由其他非GPIO外设控制就像经常说的USART 由 DR寄存器进行输出 STM32的IO复用功…

docker 笔记11: Docker容器监控之CAdvisor+InfluxDB+Granfana

1.原生命令 docker stats命令的结果 是什么 2.是什么 容器监控3剑客 CAdvisor监控收集InfluxDB存储数据Granfana展示图表 3.CAdvisor 4.InfluxDB 5.Granfana 6.总结 7.compose容器编排&#xff0c;一套带走 新建目录 7.1新建3件套组合的 docker-compose.yml version: 3.1vo…

通过 Jetbrains GateWay实现Remote Development

本次环境准备 环境准备&#xff1a;win10、一台安装有树莓派系统的树莓派&#xff08;也可以是其他的服务器&#xff09; 第一步&#xff1a;通过官网下载JetBrains Gateway 官网地址&#xff1a;https://www.jetbrains.com/remote-development/gateway/ 第二步&#xff1a;安装…

Shell 运算符及语法结构

目录 一、Shell运算符 1.1 表达式expr 1.2 运算操作 1.3 操作实例 二、Shell条件判断 2.1 基本语法 2.2 值、权限、类型、多条件判断 三、Shell流程控制 3.1 if 流程语法 3.2 case 流程语法 3.3 for 流程语法 3.4 内部运算符 3.5 while循环流程语法 四、Shell读…

ElasticSearch的安装部署-----图文介绍

文章目录 背景什么是ElasticSearch使用场景 ElasticSearch的在linux环境下的安装部署前期准备分配权限(正式实操)启动ElasticSearch创建用户组创建用户&#xff0c;并设置密码用户添加到elasticsearch用户组指定用户操作目录的一个操作权限切换用户 解压elasticsearch修改es的配…

计算机脚本的概念,如何编写、使用脚本 (Script)?

一、脚本的概念和使用场景 在计算机领域的脚本&#xff0c;指的是使用一种特定的描述性语言&#xff0c;依据一定的格式编写的可执行文件脚本语言又被称为扩建的语言或者动态语言, 是一种编程语言, 用来控制软件应用程序, 脚本通常是以文本 (ASCⅡ) 保存, 只是在被调用时进行解…

【Docker】Docker的使用案例以及未来发展、Docker Hub 服务、环境安全的详细讲解

Docker的工具实践及root概念和Docker容器安全性设置 1. 使用案例2. Docker解决的问题3. Docker未来发展4. Docker Hub 服务5. 技术局限6. Docker环境安全7. 容器部署安全 1. 使用案例 Docker是一个命令行工具&#xff0c;它提供了中央“docker”执行过程中所需的所有工具。这使…