【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://xiahunao.cn/news/2868423.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

力扣hot100:416.分割等和子集(组合/动态规划/STL问题)

组合数问题 我们思考一下&#xff0c;如果要把数组分割成两个子集&#xff0c;并且两个子集的元素和相等&#xff0c;是否等价于在数组中寻找若干个数使之和等于所有数的一半&#xff1f;是的&#xff01; 因此我们可以想到&#xff0c;两种方式&#xff1a; ①回溯的方式找到t…

DC-DC电源管理芯片MC34063A介绍

MC34063A 为一单片 DC-DC 变换集成电路&#xff0c;内含温度补偿的参考电压源&#xff08;1.25V&#xff09;、比较器、能有效限制电流及控制工作周期的振荡器&#xff0c;驱动器及大电流输出开关管等。外配少量元件&#xff0c;就能组成升压、降压及电压反转型 DC-DC 变换器。…

计算机系统基础 2 Intel 中央处理器

Intel微处理器的发展史 INTegrated ELectronics&#xff08;集成电子&#xff09;的缩写 先后推出的中央处理器&#xff1a; Intel4004、Intel8008、Intel8080/8085、8086/8088、80186、80286、i386、i486 Pentium&#xff08;奔腾&#xff09;、Pentium II、Pentium III、Pen…

Android Studio实现内容丰富的安卓宠物用品商店管理系统

获取源码请点击文章末尾QQ名片联系&#xff0c;源码不免费&#xff0c;尊重创作&#xff0c;尊重劳动。 项目编号128 1.开发环境android stuido jdk1.8 eclipse mysql tomcat 2.功能介绍 安卓端&#xff1a; 1.注册登录 2.系统公告 3.宠物社区&#xff08;可发布宠物帖子&#…

php中 0 == ‘’(0等于任意字符串) 判断是否成立 返回true

php中不同类型变量之间比较大小 一、背景二、探究0是为什么&#xff1f;三、探究 0all是为什么&#xff1f;四、程序中如何判断0是否等于指定字符串 一、背景 最近在项目实际开发中&#xff0c;我需要判断前端传来的参数值是否等于一个字符串&#xff1b;然后发现当参数值是0时…

论文阅读——ViTAE

ViTAE: Vision Transformer Advanced by Exploring Intrinsic Inductive Bias ViTAE旨在将细胞神经网络中固有的IB引入视觉转换器。如图2所示&#xff0c;ViTAE由两种类型的细胞组成&#xff0c;即RC和NC。RC负责将多尺度上下文和局部信息嵌入到令牌中&#xff0c;NC用于进一步…

XXE漏洞原理和pikachu靶场实验

★★免责声明★★ 文章中涉及的程序(方法)可能带有攻击性&#xff0c;仅供安全研究与学习之用&#xff0c;读者将信息做其他用途&#xff0c;由Ta承担全部法律及连带责任&#xff0c;文章作者不承担任何法律及连带责任。 1、XXE漏洞原理 XXE全称&#xff1a;XML External Enti…

JUnit 面试题及答案整理,最新面试题

JUnit中的断言&#xff08;Assert&#xff09;有哪些类型&#xff1f; JUnit提供了多种断言类型来帮助测试代码的正确性。常见的断言类型包括&#xff1a; 1、assertEquals&#xff1a; 用于检查两个值是否相等。如果不相等&#xff0c;测试失败。 2、assertTrue和assertFal…

HarmonyOS NEXT应用开发—折叠屏音乐播放器方案

介绍 本示例介绍使用ArkUI中的容器组件FolderStack在折叠屏设备中实现音乐播放器场景。 效果图预览 使用说明 播放器预加载了歌曲&#xff0c;支持播放、暂停、重新播放&#xff0c;在折叠屏上&#xff0c;支持横屏悬停态下的组件自适应动态变更。 实现思路 采用MVVM模式进…

【消息队列开发】 实现消息垃圾回收

文章目录 &#x1f343;前言&#x1f38b;准备工作&#x1f38d;具体实现&#x1f6a9;创建一个新文件&#x1f6a9;读取有效对象&#x1f6a9;把有效消息写入新文件中&#x1f6a9;以旧换新&#x1f6a9;更新统计文件&#x1f6a9;特别注意&#x1f6a9;完整代码 ⭕总结 &…

2.1_5 数据交换方式

文章目录 2.1_5 数据交换方式&#xff08;一&#xff09;为什么要数据交换&#xff1f;&#xff08;二&#xff09;数据交换方式&#xff08;1&#xff09;电路交换&#xff08;Circuit Exchanging&#xff09;&#xff08;2&#xff09;报文交换&#xff08;Message Exchangin…

mybatis源码阅读系列(二)

前言 上一篇文章mybatis源码阅读系列&#xff08;一&#xff09;介绍了mybatis和原生jdbc的区别&#xff0c;并通过代码展示了两者的运行过程和结果&#xff0c;下面让我们继续详细了解下mybatis的执行过程&#xff1b; package com.wyl.mybatis.service;import com.wyl.mybat…

环形链表2(C++), test ok

1. 题目 2. 思路分析&#xff1a; 与环形链表1一样&#xff0c;我们需要定义慢指针和快指针&#xff0c;确定链表是否有环&#xff0c;如果链表没有环的话&#xff0c;直接置空即可。如果链表有环&#xff0c;则需要向环形链表1一样&#xff0c;让快指针不断追赶慢指针&#x…

NVENC 视频编码器 API 编程指南 ( 中文转译 )

基于 NVIDIA Kepler™ 和更高版本 GPU 架构的 NVIDIA GPU 包含基于硬件的 H.264/HEVC/AV1 视频编码器&#xff08;以下简称 NVENC&#xff09;。NVENC 硬件采用 YUV/RGB 作为输入&#xff0c;并生成符合H.264/HEVC/AV1 标准的视频比特流。可以使用 NVIDIA 视频编解码器 SDK 中提…

Learn OpenGL 15 面剔除

面剔除 尝试在脑子中想象一个3D立方体&#xff0c;数数你从任意方向最多能同时看到几个面。如果你的想象力不是过于丰富了&#xff0c;你应该能得出最大的面数是3。你可以从任意位置和任意方向看向这个球体&#xff0c;但你永远不能看到3个以上的面。所以我们为什么要浪费时间…

Avalonia学习1:下载通用皮肤SukiUI,并在windows上启动成功

目录 1、引言 2、碰到的问题 1、下载下拉VS2022老版本的用不了。 2、升级后&#xff0c;发现没有装wsl&#xff0c;导致启动不了&#xff0c;但wsl又由于国内的关系安装不了&#xff0c;怎么办呢&#xff0c; 1、引言 最近在想有没有什么可以开发在Linux下运行…

公众号留言功能恢复了,你的开通了吗?

了解公众号的人都知道&#xff0c;腾讯在2018年3月宣布暂停新注册公众号的留言功能&#xff0c;这之后注册的公众号都不具备留言功能。 这成了很多号主运营人的一块心病&#xff0c;也包括我。 没有留言&#xff0c;就好似一个人玩单机游戏&#xff0c;无法与读者互动&#xff…

一文总结python的异常数据处理示例

AI应用开发相关目录 本专栏包括AI应用开发相关内容分享&#xff0c;包括不限于AI算法部署实施细节、AI应用后端分析服务相关概念及开发技巧、AI应用后端应用服务相关概念及开发技巧、AI应用前端实现路径及开发技巧 适用于具备一定算法及Python使用基础的人群 AI应用开发流程概…

vue 记录一个echarts页面 单色环形饼图 多色环形饼图 柱状图加折线图 饼状图 双柱状图 雷达图 多色堆叠柱状图

“设备使用”模块没有做 因为项目不需要 仅自己记录使用 可供参考 那么上代码 <template><!--app-container--><div class"home-wrap"><div class"wrap" v-if"schoolId"><!--第一块--><div class"statis…

PS学习-抠图-蒙版-冰块酒杯等透明物体

选中图&#xff0c;ctrlA 全选 ctrlC复制 创建一个蒙版图层 选中蒙版Alt 点击进入 ctrlv 复制 ctrli 反转 原图层 ctrldelete填充为白色 添加一个背景&#xff0c;这个方法通用 首选创建一个 拖到最底部 给它填充颜色 这个可能是我图片的原因。视频是这样做的