[C语言]分支语句和循环语句

[C语言]分支语句和循环语句

文章目录

  • [C语言]分支语句和循环语句
    • C语言语句分类
    • 分支语句
      • if语法结构
      • else的匹配规则
      • switch语句
      • switch语句中的break
      • switch语句中default
    • 循环语句
      • while循环
      • while循环中的break和continue
      • for循环
      • for循环中的break和continue
      • for循环的变种
      • do while循环
      • do while循环中的break和continue
    • goto语句

C语言语句分类

C语言的语句可分为以下五类:

  1. 表达式语句
  2. 函数调用语句
  3. 控制语句
  4. 复合语句
  5. 空语句

其中,控制语句用于控制程序的执行流程,以实现程序的各种结构方式,C语言有九种控制语句。 可分成以下三类:

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

C语言是结构化的程序设计语言,包含如下结构:

  • 顺序结构 – 按照代码既定顺序执行
  • 选择结构 – 选择一部分代码执行
  • 循环结构 – 重复执行同一段代码

image-20230820102122014

C语言通过分支语句来形成选择结构,通过循环语句来形成循环结构。无论是分支语句还是循环语句都属于控制语句

分支语句

if语法结构

if语句有以下三种语法结构:

  1. 单分支
语法结构:
if(表达式)语句;
  • 表达式为真,执行语句。
#include <stdio.h>int main()
{int age = 16;if (age < 18) //表达式为真,输出未成年printf("未成年\n");return 0;
}
  1. 双分支
if(表达式)语句1;
else语句2;
  • 表达式为真,执行语句1。
  • 表达式为假,执行语句2。
#include <stdio.h>int main()
{int age = 20;if (age < 18) //表达式为假,输出成年printf("未成年\n"); elseprintf("成年\n");return 0;
}
  1. 多分支
if(表达式1)语句1;
else if(表达式2)语句2;
else语句3;
  • 表达式1为真,则执行语句1。
  • 表达式2为真,执行语句2。
  • else前的所有表达式都为假,执行语句3。
  • 可以使用多个else if来控制多个分支。
#include <stdio.h>int main()
{int age = 59;if (age < 18)printf("未成年\n");else if (age >= 18 && age < 60) //该表达式为真,输出成年printf("成年\n");elseprintf("老年\n");return 0;
}

补充:

  • C语言中0表示假,1表示真。
  • if语法结构中无论有多少分支,最终只能选择其中一个分支执行。
  • if、else if、else只能控制后续的一条语句,如果要控制多条语句需要用{}将语句变成代码块。

代码块中可以有多条语句,使用代码块的结构如下:

#include <stdio.h>
int main()
{if(表达式){语句列表1}else{语句列表2}return 0;
}

else的匹配规则

else是和它离的最近的if匹配的。

#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; //没有输出
}

由于else匹配的是最近的if,else是和if (b == 2)语句匹配的,因此当if (a == 1)中条件不成立时,打印语句就都不会被执行。为了提高代码的可读性,建议修改成如下写法:

#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;
}

以上两段代码的功能是相同的,但是由于书写方式不同,可读性就有所不同。

switch语句

switch语句也是一种分支语句,常常用于多分支的情况。

switch语句的主要语法结构如下:

switch(整型表达式)
{case 整形常量表达式:语句;//...
}
  • switch中必须使用整形表达式作为判断对象。
  • case中必须使用整形常量表达式作为判断条件。
  • switch中的整形表达式和case整形常量表达式进行对比判断,进行选择进入到对应的case情况中。
#include <stdio.h>int main()
{int day = 0;scanf("%d", &day); //输入为4switch (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;//输出为星期四 星期五 星期六 星期天
}

虽然在上面这段代码中day选择了case 4,但是由于该情况中没有控制结束,因此switch语句会顺序执行,将case 5、case 6、case 7也执行。

switch语句中的break

在switch语句中的 break可以把语句列表划分为不同的分支部分。

#include <stdio.h>
int main()
{int day = 0;scanf("%d", &day);//输入为4switch (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;//输出为星期四
}

在执行完case 4中的语句后,break控制了该情况结束,跳出并且结束switch语句。

switch语句中default

default表示除以上case情况外的所有情况。

#include <stdio.h>
int main()
{int day = 0;scanf("%d", &day); //输入8switch (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;default:printf("输入错误\n");break;}return 0; //输出为输入错误
}

循环语句

while循环

while循环的语法结构:

while(表达式)循环语句;
  • 循环判断表达式,表达式为真,执行循环语句。
  • 表达式为假,结束循环。
  • 循环语句为多条语句时,需要使用{}将其变成代码块。
#include <stdio.h>int main()
{int i = 0;while (i < 5){printf("%d ", i);i++;}return 0; //输出 0 1 2 3 4
}

while循环中的break和continue

while中的break是用于永久终止循环的。在循环中只要遇到break,就停止后期的所有的循环,直接终止循环。

#include <stdio.h>int main()
{int i = 0;while (i < 5){if (i == 3)break;printf("%d ", i);i++;}return 0; //输出为 0 1 2
}

当i=3时,while表达式判断为真执行循环语句,if表达式判断为真,执行break语句终止了while循环。

continue是用于终止本次循环的,也就是本次循环中continue后边的代码不会再执行, 而是直接跳转到while语句的判断部分。进行下一次循环的入口判断。

#include <stdio.h>int main()
{int i = 0;while (i < 5){i++;if (i == 3)continue;printf("%d ", i);}return 0; //输出为 1 2 4 5
}

当i=3时,while表达式判断为真执行循环语句,if表达式判断为真,执行continue语句终止了本次循环,进入了下一次循环。

while循环的大致流程图:

image-20230820133359713

for循环

for循环的语法结构:

for(表达式1; 表达式2; 表达式3)循环语句;
  • 表达式1为初始化部分,用于初始化循环变量的。
  • 表达式2为条件判断部分,用于判断循环时候终止。
  • 表达式3为调整部分,用于循环条件的调整。
  • 循环语句为多条语句时,需要使用{}将其变成代码块。
#include <stdio.h>int main()
{int i = 0;for (i = 1; i < 10; i++){printf("%d ", i);}return 0; //输出为 1 2 3 4 5 6 7 8 9
}

for循环中的break和continue

在for循环中也可以出现break和continue,他们的意义和在while循环中是一样的。

#include <stdio.h>int main()
{int i = 0;for (i = 1; i < 5; i++){if (i == 3)break;printf("%d ", i);}return 0; //输出为 1 2
}

当i=3时,for表达式判断为真执行循环语句,if表达式判断为真,执行break语句终止了for循环。

#include <stdio.h>int main()
{int i = 0;for (i = 1; i < 5; i++){if (i == 3)continue;printf("%d ", i);}return 0; //输出为 1 2 4
}

当i=3时,for表达式判断为真执行循环语句,if表达式判断为真,执行continue语句终止了本次循环,进入了下一次循环。

for循环的大致流程图:

image-20230820140402568

for循环的变种

#include <stdio.h>int main()
{for (;;){printf("hehe\n");}return 0; //死循环输出 hehe
}

for循环中的初始化部分,判断部分,调整部分都是可以省略的,全部都省略相当于循环条件永远为真。

#include <stdio.h>int main()
{int i = 0;int j = 0;for (i = 0; i < 10; i++){for (j = 0; j < 10; j++){printf("hehe\n");}}return 0; //输出为100个hehe
}

for循环进行了嵌套,外层循环循环10次,外层循环每次都执行一次内层循环,一次内层循环执行10次,因此一共是100次。

#include <stdio.h>int main()
{int i = 0;int j = 0;for (; i < 10; i++){for (; j < 10; j++){printf("hehe\n");}}return 0; //输出为10个hehe
}

for循环进行了嵌套,外层循环循环10次,外层循环每次都执行一次内层循环,第一次内层循环执行10次后,j为10,下一层内层循环没有初始化,j依旧为10,内层循环无法再执行,因此一共是10次。

#include <stdio.h>int main()
{int x, y;for (x = 0, y = 0; x < 2 && y < 5; ++x, y++){printf("hehe\n");}return 0; //输出为2个hehe
}

循环的判断条件是x < 2 && y < 5,循环两次后x<2不再满足,因此只能执行两次。

#include <stdio.h>int main()
{int i = 0;int k = 0;for (i = 0, k = 0; k = 0; i++, k++)k++;return 0;
}

判断条件是k=0,是一个赋值语句,赋值语句的结果为所赋的值,因此该语句的结果为0,循环一次都不执行。

do while循环

do while循环的语法结构:

do循环语句;
while(表达式);
  • 先执行一次循环语句在判断表达式,因此循环至少执行一次。
  • 循环语句为多条语句时,需要使用{}将其变成代码块。
#include <stdio.h>int main()
{int i = 1;do{printf("%d ", i);i++;} while (i <= 5);return 0; //输出 1 2 3 4 5
}

do while循环中的break和continue

#include <stdio.h>
int main()
{int i = 1;do{if (3 == i)break;printf("%d ", i);i = i + 1;} while (i <= 5);return 0; //输出 1 2 
}

i=3时,if表达式判断为真,执行break语句终止了循环。

#include <stdio.h>
int main()
{int i = 0;do{i = i + 1;if (3 == i)continue;printf("%d ", i);} while (i < 5);return 0;//输出 1 2 4 5
}

i=3时,if表达式判断为真,结束本次循环进行下一次循环。

do while循环的大致流程图:

image-20230820171738939

总结:

  • 无论何种循环语句,break的作用都是结束循环。
  • 无论何种循环语句,continue的作用都是不执行continue后的代码,跳转到循环判断。(for循环会在跳转到循环判断前进行循环条件的调整)

goto语句

C语言中goto语句可以向标志位置进行程序跳转。

#include <stdio.h>int main()
{printf("hello world\n");goto flag;printf("hello goto\n");
flag:printf("hello blog\n");return 0; //输出为 hello world hello blog
}

其中flag:作为标志位供goto语句进行跳转,由于goto语句跳转到了标志位置,会导致中间的代码不被执行。

  • 标志名任意,只需要使用标志名:标志位置即可使用goto语句跳转。
  • goto语句由于会导致代码的可读性和可维护性降低等原因,因此不常被使用。
  • goto语句适用于从多层循环的内部向外跳转。

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

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

相关文章

小程序多图片组合

目录 子组件 index.js 子组件 index.wxml 子组件 index.wxss 父组件引用&#xff1a; 子组件&#xff1a;preview-image 子组件 index.js Component({properties: {previewData: {type: Array,default: [],observer: function (newVal, oldVal) {console.log(newVal, ol…

基于Pytorch实现的声纹识别系统

前言 本项目使用了EcapaTdnn、ResNetSE、ERes2Net、CAM等多种先进的声纹识别模型&#xff0c;不排除以后会支持更多模型&#xff0c;同时本项目也支持了MelSpectrogram、Spectrogram、MFCC、Fbank等多种数据预处理方法&#xff0c;使用了ArcFace Loss&#xff0c;ArcFace loss…

Java版本+企业电子招投标系统源代码+支持二开+Spring cloud tbms

​ 项目说明 随着公司的快速发展&#xff0c;企业人员和经营规模不断壮大&#xff0c;公司对内部招采管理的提升提出了更高的要求。在企业里建立一个公平、公开、公正的采购环境&#xff0c;最大限度控制采购成本至关重要。符合国家电子招投标法律法规及相关规范&#xff0c;以…

【广州华锐互动】3D空间编辑器:一款简洁易用的VR/3D在线编辑工具

随着虚拟现实技术的不断发展&#xff0c;数字孪生技术的应用已经被广泛应用于产品设计和制作中&#xff0c;能充分发挥企业应用3D建模的优势&#xff0c;凸显了三维设计的价值&#xff0c;在生产阶段也能够充分发挥3D模型的作用。 如今&#xff0c;广州华锐互动开发的3D空间编辑…

C#程序配置读写例子 - 开源研究系列文章

今天讲讲关于C#的配置文件读写的例子。 对于应用程序的配置文件&#xff0c;以前都是用的ini文件进行读写的&#xff0c;这个与现在的json类似&#xff0c;都是键值对应的&#xff0c;这次介绍的是基于XML的序列化和反序列化的读写例子。对于ini文件&#xff0c;操作系统已经提…

动态内存开辟

动态内存开辟 1.动态内存开辟相关试题 题目1&#xff1a; void GetMemory(char *p) {p (char *)malloc(100); } void Test(void) {char *str NULL;GetMemory(str);strcpy(str, "hello world");printf(str); }解释&#xff1a;这里在Test函数中&#xff0c;只是将…

【Matter】基于Ubuntu 22.04搭建matter开发环境:chip-tool 配网之 matter-over-wifi

前言 主要是记录一下学习过程&#xff0c;梳理下思路&#xff0c;抛转~ 官方的开发环境&#xff0c;基于Linux版本&#xff0c;官方的环境是基于树莓派环境的&#xff0c;原理其实也比较明了&#xff0c;目的也比较明确&#xff0c;就是达到Linux 主机和wifi 路由在同一局域网…

flink jira 提交开源bug

注册apache issue账号,并申请flink空间的权限后. 提问题/bug 查看已经提交的问题:

获取excel中的图片(包含wps中嵌入单元格图片)

项目中有excel导入功能,并且需要导入excel中的图片;模板如图: 已知office中插入的图片为浮动形式;如图: wps中可以插入浮动图片,也可以插入嵌入单元格图片;如图: 并且在wps嵌入单元格形式的图片可以看到使用的是公式;如图: 问题来了,如何获取图片 并且将图片与单元格进行对应 …

Spring Boot+Redis 实现消息队列实践示例

Spring BootRedis 实现一个轻量级的消息队列 文章目录 Spring BootRedis 实现一个轻量级的消息队列0.前言1.基础介绍2.步骤2.1. 引入依赖2.2. 配置文件2.3. 核心源码 4.总结答疑 5.参考文档6. Redis从入门到精通系列文章 0.前言 本文将介绍如何利用Spring Boot与Redis结合实现…

uni-app自定义多环境配置,动态修改appid

背景 在企业级项目开发中&#xff0c;一般都会分为开发、测试、预发布、生产等多个环境&#xff0c;在工程化中使用不同的打包命令改变环境变量解决不同环境各种变量需要手动修改的问题&#xff0c;比如接口请求地址&#xff0c;不同环境的请求路径前缀都是不同的。在使用uni-…

【仿写tomcat】五、响应静态资源(访问html页面)、路由支持以及多线程改进

访问html页面 如果我们想访问html页面其实就是将本地的html文件以流的方式响应给前端即可&#xff0c;下面我们对HttpResponseServlet这个类做一些改造 package com.tomcatServer.domain;import com.tomcatServer.utils.ScanUtil;import java.io.IOException; import java.io…

Android企业项目开发实训室建设方案

一 、系统概述 Android企业项目开发作为新一代信息技术的重点和促进信息消费的核心产业&#xff0c;已成为我国转变信息服务业的发展新热点&#xff1a;成为信息通信领域发展最快、市场潜力最大的业务领域。互联网尤其是移动互联网&#xff0c;以其巨大的信息交换能力和快速渗透…

Postman返回了一个html页面

问题记录 调用公司的测试环境接口&#xff0c;从浏览器控制台接口处cCopy as cURL(cmd)&#xff0c;获取完整的请求内容&#xff0c;然后导入postman发起请求 提测时发现返回一个html页面&#xff0c;明显是被请求在网管处被拦截了&#xff0c;网关返回的这个报错html页面 …

商城-学习整理-高级-商城业务-Sentinel限流熔断降级Sleuth+Zipkin链路追踪(二十二)

目录 一、秒杀系统的架构二、SpringCloud Alibaba-Sentinel简介1、熔断降级限流什么是熔断什么是降级异同&#xff1a;什么是限流 2、Sentinel 简介官方文档&#xff1a;Sentinel 具有以下特征:Sentinel 分为两个部分: 3、Hystrix 与 Sentinel 比较4、整合 FeignSentinel 测试熔…

如何使用好Tik Tok标签流量?这些关键点要知道!

TikTok 每天有数百万用户创建大量内容。如何让你的内容受到关注&#xff1f;如何让视频能够最大限度获得曝光&#xff1f;答案之一是用好【关键词标签】&#xff0c;这将有利于你创作的内容展示到更多更合适的人面前&#xff0c;也可能会给你带来额外的流量。 要在TikTok上利用…

vscode用ssh远程连接linux

1、vscode是利用ssh远程连接linux的&#xff0c;所以首先确保vscode已经安装了这两个插件 2、点击左下角的连接 3、选择Connect to Host…… 5、按格式输入 ssh 主机名ip 比如我的&#xff1a;ssh mnt192.168.198.128 6、选择第一个打开配置文件&#xff0c;确保输入正确 7、…

攻防世界-command_execution

原题 解题思路 题目告诉了&#xff0c;这可以执行ping命令且没WAF&#xff0c;那就可以在ping命令后连接其他命令。 服务器一般使用Linux&#xff0c;在Linux中可使用“&”连接命令。 ping 127.0.0.1&find / -name "flag*" ping 127.0.0.1&cat /home/f…

5.5.webrtc的线程管理

今天呢&#xff0c;我们来介绍一下线程的管理与绑定&#xff0c;首先我们来看一下web rtc中的线程管理类&#xff0c;也就是thread manager。对于这个类来说呢&#xff0c;其实实现非常简单&#xff0c;对吧&#xff1f; 包括了几个重要的成员&#xff0c;第一个成员呢就是ins…

AutoHotKey+VSCode开发扩展推荐

原来一直用的大众推荐的SciTeAHK版&#xff0c;最近发现VSCode更舒服一些&#xff0c;有几个必装的扩展推荐一下&#xff1a; AutoHotkey Plus 请注意不是AutoHotkey Plus Plus。如果在扩展商店里搜索会有两个&#xff0c;一个是Plus&#xff0c;一个是Plus Plus。我选择Pllus&…