[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.mzph.cn/news/46136.shtml

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

相关文章

广告牌安全传感器,实时监测事故隐患尽在掌握

在现代城市中&#xff0c;广告牌作为商业宣传的重要媒介&#xff0c;已然成为城市中一道独特的风景线。然而&#xff0c;随着城市迅速发展&#xff0c;广告牌的安全问题也引起了大众关注。广告招牌一般悬挂于建筑物高处&#xff0c;量大面大。由于设计、材料、施工方法的缺陷&a…

函数栈帧的创建与销毁

目录 引言 基础知识 内存模型 ​ 寄存器的种类与功能 常用的汇编指令 函数栈帧创建与销毁 main()函数栈帧的创建 NO1. NO2. NO3. NO4. NO5. NO6. main()函数栈帧变量的创建 调用Add()函数栈帧的预备工作——传参 NO1. NO2. NO3. Add()函数栈帧的创建 …

C语言入门_Day 6布尔数与比较运算

目录 前言 1.布尔数 2.比较运算 3.易错点 4.思维导图 前言 除了算术计算以外&#xff0c;编程语言中还会大量使用比较运算&#xff0c;并会根据比较运算的结果是“真”还是“假”&#xff0c;来执行不同的代码。 当你想买一杯奶茶&#xff0c;准备支付的时候&#xff0c;支…

Codeforces EDU 151 Div.2

文章目录 A. Forbidden IntegerB. Come TogetherC. Strong PasswordD. Rating SystemE. Boxes and Balls A. Forbidden Integer Problem - A - Codeforces 给定整数n&#xff0c;从1~k中选择除了x的数&#xff0c;使这些数之和为n&#xff0c;每个数可以选择无限次 爆搜&…

[Vue]解决npm run dev报错node:internal/modules/cjs/loader:1031 throw err;

解决: 有2中方法&#xff0c;建议先尝试第一种&#xff0c;不行再第二种 第一种: 重新安装依赖环境 删除项目的node_modules文件夹&#xff0c;重新执行 # 安装依赖环境 npm install# 运行 npm run dev 我只用了第一种方法就可以了 &#xff0c;第二种方法从别的博主那看到…

【Java 动态数据统计图】动态数据统计思路案例(动态,排序,数组)二(113)

需求&#xff1a; 有一个List<Map<String.Object>>,存储了区域的数据&#xff0c; 数据是根据用户查询条件进行显示的&#xff1b;所以查询的数据是动态的&#xff1b;按区域维度统计每个区域出现的次数&#xff0c;并且按照次数的大小排序&#xff08;升序&#…

最新ChatGPT网站AI系统源码+详细图文搭建教程/支持GPT4.0/AI绘画/H5端/Prompt知识库/

一、前言 SparkAi系统是基于国外很火的ChatGPT进行开发的Ai智能问答系统。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。 那么如何搭建部署AI创作ChatGPT&#xff1f;小编这里写一个详细图文教程吧&#xff01…

从 Ansible Galaxy 使用角色

从 Ansible Galaxy 使用角色 根据下列要求&#xff0c;创建一个名为 /home/curtis/ansible/roles.yml 的 playbook &#xff1a; playbook 中包含一个 play&#xff0c; 该 play 在 balancers 主机组中的主机上运行并将使用 balancer 角色。 此角色配置一项服务&#xff0c;以…

Docker容器:docker镜像的创建及dockerfile

Docker容器&#xff1a;docker镜像的创建及dockerfile案例 一.docker镜像的三种创建方法 创建镜像有三种方法&#xff1a;基于现有镜像创建、基于本地模板创建及基于dockerfile创建 1.基于现有镜像创建 1.1 启动镜像 #首先启动一个镜像&#xff0c;在容器里做修改 docker …

SpringBoot常用注解-@PathVariable、@RequestParam 、@RequestBody

目录 PathVariable RequestParam RequestBody PathVariable PathVariable 获取url中的数据&#xff0c;绑定路径中的占位符参数到方法参数变量中&#xff0c;get或者post方式都可以&#xff0c;如果URL中无参数&#xff0c;将会出错 例如获取/login/id/name中的id值和name值 …

途乐证券|定增募资是什么意思?

作为融资手法之一&#xff0c;定增募资在企业中被广泛运用。但一般投资者对此或许不太了解&#xff0c;只知道它是一种融资手法。那么&#xff0c;定增募资到底是什么意思呢&#xff1f; 一、什么是定增募资&#xff1f; 定增募资即定向增发股票募集资金&#xff0c;是新股票发…

C++入门知识点——解决C语言不足

&#x1f636;‍&#x1f32b;️Take your time ! &#x1f636;‍&#x1f32b;️ &#x1f4a5;个人主页&#xff1a;&#x1f525;&#x1f525;&#x1f525;大魔王&#x1f525;&#x1f525;&#x1f525; &#x1f4a5;代码仓库&#xff1a;&#x1f525;&#x1f525;魔…

【C# 基础精讲】LINQ to Objects查询

LINQ to Objects是LINQ技术在C#中的一种应用&#xff0c;它专门用于对内存中的对象集合进行查询和操作。通过使用LINQ to Objects&#xff0c;您可以使用统一的语法来查询、过滤、排序、分组等操作各种.NET对象。本文将详细介绍LINQ to Objects的基本概念、常见的操作和示例&am…

Android Studio实现读取本地相册文件并展示

目录 原文链接效果 代码activity_main.xmlMainActivity 原文链接 效果 代码 activity_main.xml 需要有一个按钮和image来展示图片 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk…

Error creating bean with name ‘esUtils‘ defined in file

报错异常&#xff1a; 背景&#xff1a; esUtils在common服务中、启动media服务时候、报这个异常、后排查esUtils在启动时候发生异常引起的、在相关bean中加入try{}catch{}即可解决问题 String[] split url.split(","); HttpHost[] httpHosts new HttpHost[split.…

FirmAE 工具安装(解决克隆失败 网络问题解决)

FirmAE官方推荐使用Ubuntu 18.04系统进行安装部署&#xff0c;FirmAE工具的安装部署十分简单&#xff0c;只需要拉取工具仓库后执行安装脚本即可。 首先运行git clone --recursive https://kgithub.com/pr0v3rbs/FirmAE命令 拉取FirmAE工具仓库&#xff0c;因为网络的问题&…

c语言每日一练(10)

前言&#xff1a;每日一练系列&#xff0c;每一期都包含5道选择题&#xff0c;2道编程题&#xff0c;博主会尽可能详细地进行讲解&#xff0c;令初学者也能听的清晰。每日一练系列会持续更新&#xff0c;暑假时三天之内必有一更&#xff0c;到了开学之后&#xff0c;将看学业情…

验证评估守护关基安全 赛宁数字孪生靶场创新实践

​​近日&#xff0c;由赛宁网安主办&#xff0c;ISC互联网安全大会组委会协办的第十一届互联网安全大会&#xff08;ISC 2023&#xff09;安全运营实践论坛圆满结束。赛宁网安产品总监史崯出席并作出主题演讲&#xff1a;《基于数字孪生靶场如何开展验证评估》&#xff0c;同时…

Linux工具【2】(调试器gdb、项目自动化构建工具make/Makefile)

gdb、make/Makefile 引言调试器gdb介绍常用指令 自动化构建工具make/Makefile介绍使用依赖关系与依赖方法编辑Makefile伪目标 总结 引言 在上一篇文章中介绍了Linux中的编辑器vim与编译器gcc与g&#xff1a; 戳我看vim与gcc详解哦 在本篇文章中将继续来介绍Linux中的工具&…

【Apollo学习笔记】——规划模块TASK之LANE_CHANGE_DECIDER

文章目录 前言LANE_CHANGE_DECIDER功能简介LANE_CHANGE_DECIDER相关配置LANE_CHANGE_DECIDER总体流程LANE_CHANGE_DECIDER相关子函数PrioritizeChangeLaneUpdateStatusIsClearToChangeLaneHysteresisFilter 参考 前言 在Apollo星火计划学习笔记——Apollo路径规划算法原理与实…