【C语言】分支语句(逻辑运算符与关系运算符)

文章目录

      • **逻辑运算符(&&、||、!)**
        • 逻辑运算符特点
          • 短路
            • 短路-逻辑与
            • 短路-逻辑或
      • **关系运算符(relational expression)**
        • 运算操作符的结合律、运算符
      • **选择结构/分支结构**
        • **if 语句**
        • **复合句的if语句(if...else..语句)**
          • **不良风格的程序**
        • **悬空else问题**
        • **嵌套的if语句**
        • **switch 语句**
        • 关于switch语句中的default

知识铺垫:

C语言是结构化的程序设计语言

结构体化程序设计(structured programming):是进行模块功能和处理过程设计为主的详细设计的基本原则。是过程式程序设计的一个子集,对输入程序进行逻辑结构(下面三种结构),使得程序理解和修改更有效更容易。

任何程序由三种基本结构组合形成:顺序结构、选择结构、循环结构

  • 顺序结构:按照代码的书写顺序从前到后执行
  • 选择结构:通过给定个判断条件,当条件为真或假时执行对应程序使用if、switch实现选择(分支)结构
  • 循环结构:允许一段代码重复执行直到满足某个特定条件,循环语句有效地编写代码,避免复杂度–>使用for、while、do while实现循环结构

请添加图片描述

正文

三者结构控制程序流程:遵循顺序结构为基本主线,遇到条件表达式,程序可能因其他结构干扰主线,改变了程序流程的方向,对此为了更有效的控制程序的流程,在条件表达式中添加逻辑表达式和关系运算符

逻辑运算符(&&、||、!)

逻辑表达式由变量、常量、逻辑关系运算符组成,用于表示变量的逻辑关系。逻辑表达式只有两种结果真和假,提供逻辑判断功能,条件为真(1),为假(0)。( 注:C语言中,非0为真,0为假)

主要有三个运算符:

  • 逻辑与(AND)–>&&:并且的意思(两侧表达式同时为真,整个表达式才为真,若存在一侧为假,整个表达式为假)
  • 逻辑或(OR)------>||: 或者的意思(两侧表达式只需要一侧为真,整个表达式为真,当两侧表达式为假,整个表达式才为假)
  • 逻辑非(NOT)----->! : 取反,改变单个表达式的真假
逻辑运算符特点

先对左边的表达式求值,再对右边表达式求值,就会可能导致短路。

短路

短路:指只凭左边操作数的结果就知道整个表达式的结果,不需要执行右操作符进行判断,主要体现于逻辑与、逻辑或中的短路

短路-逻辑与

if(month >= 3 && month <= 5)判断是否是春季

对此,如果month>=3为假,根据逻辑与性质,不需要再判断(执行)month<=5真假,根据左操作数结果,可以判断整个条件表达式为假

短路-逻辑或

if(month == 2 || month == 3 || month == 4)判断是是否是春季

对此,如果month==2为假,根据逻辑或性质,继续判断(执行)month ==3是否为真,如果month ==3为真,则不需要再判断month ==4真假,根据左操作数结果,可以判断整个条件表达式为假

C语言逻辑运算符还有一个特点,它总是先对左边操作数开始判断

关系运算符(relational expression)

通过关系运算符表示变量与变量、常量之间大小的关系,关系运算符一共有六种

  • > 大于运算符
  • < 小于运算符
  • = 大于等于运算符
  • <= 小于等于运算符
  • == 相等运算符
  • != 不相等运算符

通常用于if或者while结构当中,判断大小会返回真(1)或假(0)。

这方面是最容易出现问题,需要掌握正确的使用格式并且了解表达式运算操作的处理顺序,有以下提醒

  • ==是相等运算符,=是赋值运算符。(对此if(3 ==x)和if(x ==3)写法效果相同,左边的写法是提醒程序员正确使用相等运算符)
  • 多个关系运算符不宜连用:不要把程序中复合表达式与数学表达式混为一谈(i<k<p属于数学表达式不等于程序表达式)

结果:这里连续使用小于运算符,这里系统不会报错,但是可能不能达到预期的效果,关系运算符是从左到右计算,并且会返回1或0表示真假

解释:i<k<p -->(i<k)<p,这个式子中,i<k进行判断真假,返回1或0。这样子就导致了是0或1与变量p进行对比。应该是程序表达式:i<k && k<p才达到预期的效果

运算操作符的结合律、运算符

表达式运算操作的处理顺序是由运算符的结合律、运算符共同决定

请添加图片描述

问题:当代码行的运算符比较多时,没能正确处理关系,导致执行错误

解决:熟记上面知识是比较困难,因括号优先级是最高的,用括号确定表达式的操作顺序,可以防止产生歧义并提高可读性,如if ((a | b) && (a & c))

选择结构/分支结构

if 语句

语法如下:

if(条件表达式)语句块当条件表达式为真,就执行语句块,当条件表达式为假,则跳过语句块(条件表达式被执行了)
复合句的if语句(if…else…语句)

语法如下:

if(条件表达式)
语句块1
else
语句块2

只执行if、else中一个语句块,当条件表达式为真,执行语句块1.当条件表达式为假,执行语句块

注:默认在if和else语句中默认都只控制一条语句

不良风格的程序
int main()
{
int age=18;if(age<18)
printf("未成年\n");printf("还是小孩子\n");
}
根据上面的规定,显示器上只会打印一条语句''未成年''

解决办法:使用括号括起来,表示个语句块

if(age<18)
{
printf("未成年\n")printf("还是小孩子\n");
}
悬空else问题

规则:如果有多个if和else,else总是跟最接近的if匹配

int main()
{int a = 0;int b = 2;if(a == 1)if(b == 2)printf("hehe\n");elseprintf("haha\n");return 0;
}

结果:可能想着不是hehe就是haha,但是结果是啥都不打印
解释:else跟第二个if最接近,形成if else语句,if else语句在第一个if语句中,那么第一个if语句不满足,嵌套的if else就没有机会执行 ,可用通过括号自己调整下

嵌套的if语句

代码是灵活的,if语句嵌套if语句,else里面嵌套if语句都是可以

语法:

if(条件表达式1)
{if(条件表达式2)语句块1else{if(条件表达式3)语句块2else语句块3//这里还能继续嵌套if语句}
}else语句块4

在多条件情况下,这样会导致程序可读性下降,那么if else语句中,else可以跟另一个if语句连用,构成多重判断

int main()
{int num = 0;scanf("%d", &num);if(num == 0)printf("输⼊的数字是0\n");else if(num > 0) //这⾥的if 相当于嵌套在els语句中,形成了嵌套结构printf("输⼊的数字是正数\n");elseprintf("输⼊的数字是负数\n");return 0;
}

这里的else if就相当于else语句块里面有个if语句,当然else if可以多次使用,具体问题具体分析

switch 语句

在实现分支语句时,除了使用if语句实现的,还可以通过switch语句实现语句

其实switch语句是一种特殊形式的if…else结构,用于判断条件有个有多个结果的情况。switch是多分支选择语句,而if语句只有两个分支可供选择。输入if语句可以来实现多分支选择,这样会导致程序冗长难读,这个就是switch语句存在的理由

语法:

switch(expression){case value1:statementcase value2:statementdefault: statement}

根据expression不同的数值,对应不同的case分支。如果没有与case对应数值,则执行default分支(跟else一样)

注意点:

  • expression必须为整型类型
  • case后面的值,必须是整形常量表达式
  • case和后面数字之间必须由空格
  • 无论是case还是default,在使用过程中需要:符号表示后面内容
关于switch语句中的default

当使用switch语句时,可能出现这种情况,switch中的expression无法匹配case语句,这个时候有两种做法,一、不做任何处理 二、在添加default子句。但是程序不需要default,建议保留语句default: break;目的是为防止别人误会你忘记经行default的处理

在 switch 语句中 case 语句和 default 语句是没有顺序要求的,只要你的顺序是满足实际需求的就可以,通常是将default最后处理的

分析代码:

int main()
{
int input=0;scanf("%d",&input);//这里input给数字7switch(input%3){case 0:printf("整除,余数是零");case 1printf("余数是1\n"); case 2:printf("余数是2\n");  }return 0;
}

结果:

解释:switch语句具有分支效果,当执行某一条case语句中,如果后面没有break语句,代码将继续执行下去,可能执行其他case语句中,直到遇到break语句跳出或者switch语句结束。

所以在switch语句中使用break语句才能达成真正的分支同时,case语句后面不是一定要跟着break语句,需要根据实际需要来决定

感谢你的观看,这里是店小二的学习笔记!

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

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

相关文章

uniapp 之 实现商品详情的锚点跳转(类似京东商品详情-点击顶部按钮跳转的对应的页面的内容区域)

类似京东商品详情-点击顶部详情跳转到页面对应的详情区域&#xff0c;点击评价跳转到页面对应的评价区域等。 照例&#xff0c;先封装方法&#xff1a; 封装方法 util.js /*** 锚点跳转&#xff08;如&#xff1a;商品详情页面跳转&#xff09;* param {string} targetId 目…

sqllab第十八关通关笔记

知识点&#xff1a; UA注入 不进行url解析&#xff0c;不能使用 %20 编码等操作出现在User-agent字段中一般为insert语句 insert 表名(字段1&#xff0c;字段2&#xff0c;。。。) values(数据1&#xff0c;数据2&#xff0c;。。。) 通过admin admin进行登录发现页面打印出了…

【中等】保研/考研408机试-二叉树相关

目录 一、基本二叉树 1.1结构 1.2前序遍历&#xff08;注意三种遍历中Visit所在的位置&#xff09; 1.2中序遍历 1.3后序遍历 二、真题实战 2.1KY11 二叉树遍历&#xff08;清华大学复试上机题&#xff09;【较难】 2.2KY212 二叉树遍历二叉树遍历&#xff08;华中科技大…

通信信号处理中的调制识别技术及其基于C++ Qt的实现

在现代通信系统中,调制技术扮演着至关重要的角色。调制是将基带信号转换为适合在信道中传输的高频信号的过程。常见的模拟调制方式有幅度调制(AM)和频率调制(FM),数字调制方式有频移键控(FSK)和相移键控(PSK)。为了实现高效、可靠的通信,接收端必须能够准确识别发送端所采用的调…

详解命令docker run -d --name container_name -e TZ=Asia/Shanghai your_image

docker run 是Docker的主要命令&#xff0c;用于从镜像启动一个新的容器。下面详细解释并举例说明 -d, --name, -e TZ 参数的用法&#xff1a; -d 或 --detach&#xff1a; 这个标志告诉Docker以守护进程&#xff08;后台&#xff09;模式运行容器。这意味着当你执行 docker ru…

前端学习笔记|JavaScript基础

JS基础 数据类型 基于动力节点视频。 Number、String、Boolean、object 强制转换 Number 强转,boolean强转(undefined、null、NaN都是转成false)&#xff0c;String强转 myAge Number("123445"); Boolean(0); String(123);parseInt、parseFloat 遇到非数字&…

Java——网络编程

网络编程基础类 InetAddress类 java.net.InetAddress类用来封装计算机的IP地址和DNS(没有端口信息),它包括一个主机名和一个ip地址,是java对IP地址的高层表示。大多数其他网络类都要用到这个类&#xff0c;包括Sorket、ServerSocker、URL、DatagramSorket、DatagramPacket等常…

15.7k stars一个实用型OCR,支持80多种语言

一个实用型 OCR,支持 80 多种语言和所有流行的书写脚本&#xff0c;包括&#xff1a;拉丁文、中文、阿拉伯文、梵文、西里尔文等。 特点 支持本地或云/API部署 准确度提高到 99% 以上 完全可定制,支持 80 多种语言 支持表格识别 二维码/条码提取识别 GitHub数据 15.7k s…

LAMP下Moodle平台安装

目录 一、虚拟机安装 二、Linux使用ubuntu 三、设置管理员root的密码: 四、注销登录 五、用root账号重新登录 六、安装vmware tools 七、更新系统 八、允许SSH客户端登录 九、实体机中安装远程管理客户端 十、实体机安装文件传输工具 十一、使用Putty登录,安装插件…

学习总结2

第二周总结 一、总结贪吃蛇制作思路 1.绘制API&#xff0c;所以需要引入graphics.h这个图形界面库。 2.游戏规则 蛇是一节一节的&#xff0c;每吃掉一个事物都会长一节蛇吃食物需要移动&#xff0c;如果需要移动那么就会有坐标的变化。蛇没吃掉一个事物都会随机产生一个食物…

鸿蒙Harmony应用开发—ArkTS声明式开发(容器组件:Column)

沿垂直方向布局的容器。 说明&#xff1a; 该组件从API Version 7开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 子组件 可以包含子组件。 接口 Column(value?: {space?: string | number}) 从API version 9开始&#xff0c;该接口…

MySQL 中的自增ID及其应用场景

在MySQL中&#xff0c;自增ID主要体现在几种不同的场景下&#xff0c;每种自增ID都有其特定用途和行为特征&#xff1a; 1. Auto-Increment ID (PRIMARY KEY AUTO_INCREMENT) 场景&#xff1a;在创建表时&#xff0c;可以为某个整数字段设置AUTO_INCREMENT属性&#xff0c;生成…

LeetCode--58

58. 最后一个单词的长度 给你一个字符串 s&#xff0c;由若干单词组成&#xff0c;单词前后用一些空格字符隔开。返回字符串中 最后一个 单词的长度。 单词 是指仅由字母组成、不包含任何空格字符的最大 子字符串 。 示例 1&#xff1a; 输入&#xff1a;s "Hello W…

unity学习(57)——选择角色界面--删除角色2

1.客户端添加点击按钮所触发的事件&#xff0c;在selectMenu界面中增加myDelete函数&#xff0c;当点击“删除角色”按钮时触发该函数的内容。 public void myDelete() {string message nowPlayer.id;//string m Coding<StringDTO>.encode(message);NetWorkScript.get…

Pandas中高效选择和替换操作总结

Pandas是数据操作、分析和可视化的重要工具&#xff0c;有效地使用Pandas可能具有挑战性&#xff0c;从使用向量化操作到利用内置函数&#xff0c;这些最佳实践可以帮助数据科学家使用Pandas快速准确地分析和可视化数据。 图片 在本文中&#xff0c;我们将重点介绍在DataFram…

Docker 学习笔记一

一、什么是docker Docker 是一个基于轻量级虚拟化技术的容器&#xff0c;整个项目基于Go语言开发&#xff1b;Docker是一个C/S架构&#xff0c;后端众多模块各司其职&#xff0c;docker的daemon是运行在主机上通过client可以进行通信。 docker 由三部分组成&#xff1a;镜像(…

使用Seata实现分布式事务真香!

之前分享了六种分布式事务方案&#xff1a; 本地消息表&#xff1a;如何通过本地消息表实现分布式事务 最大努力通知&#xff1a;如何使用最大努力通知实现分布式事务&#xff1f;与本地消息表区别&#xff1f; XA模式&#xff1a;用二阶段三阶段提交实现分布式事务 TCC模式…

【820复试】数据结构面试问题

文章目录 1.用循环比递归的效率高吗2.顺序表和链表的比较3.头指针和头结点的区别4.如何区分循环队列是队满还是队空&#xff1f;5.栈在通过后缀表达式求值的算法思想6.栈在递归中的应用7.队列在层次遍历中的作用8.队列在计算机系统中的应用9.矩阵的压缩存储10.串的模式匹配11.如…

解析编程中不可或缺的基础:深入了解结构体类型

精琢博客&#xff0c;希望可以给大家带来收获~ 博主主页&#xff1a;17_Kevin-CSDN博客 收录专栏&#xff1a;《C语言》 引言 在编程中&#xff0c;结构体是一种自定义的数据类型&#xff0c;它允许开发人员将不同类型的数据组合在一起&#xff0c;并为其定义相关属性和行为。…

服务端出现大量的time_wait,如何排差和解决?

出现大量的TIME_WAIT状态通常是由于网络连接的频繁创建和关闭所导致的。TIME_WAIT状态是TCP连接关闭后的一种状态&#xff0c;在该状态下&#xff0c;连接的端口在一段时间内仍然被保留&#xff0c;以确保延迟的数据包不会在网络中出现问题。 要排查和解决大量的TIME_WAIT状态…