C语言操作符下

        在这篇文章中,主要讲解关系操作符、条件操作符、逻辑操作符,及其短路。

一. 关系操作符

        C语言用于比较的表达式,称为关系表达式,里面运用的运算符就称“关系运算符”,主要有下面6个:

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

关系表达式通常返回0或者1,表示真假 。关系表达式常用于if或while结构。(if:https://blog.csdn.net/wait___wait/article/details/134805824?spm=1001.2014.3001.5502)

(while:https://blog.csdn.net/wait___wait/article/details/135158422?spm=1001.2014.3001.5502)

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

20 > 12//返回1

12 > 20//返回0

printf("%d", 2 == 2);//打印1

        注意1:相等运算符==与赋值运算符是两个不一样的运算符,不能混淆。

有时候,可能会不小心写出下面的代码,它可以运行,但很容易出现意料之外的结果。(赋值运算符:https://blog.csdn.net/wait___wait/article/details/135242898?spm=1001.2014.3001.5502)

if (x = 3)...

上面示例中,意愿是x == 3,但不小心写成x = 3。这个式子表示对变量x赋值3,它的返回值是3,所以if判断总为真。

为了防止这种错误,可以将变量写在等号的右边。 这样的话,如果把==误写成=,编译器会报错,因为左操作符不能为常量

if (3==x)...

        注意2:多个关系运算符不宜连用

i  <  j  <  k 

上述示例中,连续使用两个小于运算符,是合法表达式,不会报错,但是通常达不到想要的效果,即不是保证变量 j 的值在 i 和 k 之间。因为关系运算符是从左到右计算,所以实际执行的是下面的表达式。

 (i < j)< k

上面式子中,i  <   j返回0或 1 ,所以最终是0或 1 与变量 k 进行比较。如果想要判断变量 j 的值是否在 i 和 k 之间,应该使用下面的写法。

i < j && j < k 

 如:

//输入一个年龄,如果年龄在18岁-36岁之间,就输出青年
#include<stdio.h>
int main()
{
	int age = 0;
	scanf("%d", &age);
	if (18 <= age && age <= 36)
	{
		printf("青年\n");
	}
	return 0;
}
//输入34
//打印青年

而如果我们这样写

//输入一个年龄,如果年龄在18岁-36岁之间,就输出青年
#include<stdio.h>
int main()
{
	int age = 0;
	scanf("%d", &age);
	if (18 <= age <= 36)
	{
		printf("青年\n");
	}
	return 0;
}

这是因为,我们先拿18和age中存放的10比较,表达式18 <= 10为假,18 <= 10 的结果是0,再拿0和36 比较, 0 < 36 为真,所以打印了青年 。所以即使age是10的时候,也能打印青年。

二. 条件操作符(也叫三目操作符)

        与单目操作符和双面操作符类似,(单目操作符和双目操作符:https://blog.csdn.net/wait___wait/article/details/135242898?spm=1001.2014.3001.5502)三目操作符,需要接受三个操作数,形式如下:

exp1 ? exp2 :exp3

条件操作符的运算逻辑是:如果exp1为真,exp2计算,计算的结果是整个表达式的结果;如果exp1为假,exp3计算,计算的结果是整个表达式的结果。 

练习1:使用条件操作符表示下面代码的逻辑

#include<stdio.h>
int main()
{
	int a = 0;
	int b = 0;
	scanf("%d %d", &a, &b);
	if (a > 5)
	{
		b = 3;
	}
	else
		b = -3;
	printf("%d\n", b);
	return 0;
}
//改造后
#include<stdio.h>
int main()
{
	int a = 0;
	int b = 0;
	scanf("%d", &a);
	b = a > 5 ? 3 : -3;
	printf("%d\n", b);
	return 0;
}

练习2:使用条件表达式实现找两个数的较大值

#include<stdio.h>
int main()
{
	int a = 0;
	int b = 0;
	scanf("%d %d", &a, &b);
	int m = a > b ? a : b;
	printf("%d\n", m);
	return 0;
}

 三. 逻辑操作符:&&,||,!

        逻辑运算符提供逻辑判断功能,用于构建更复杂的表达式,主要有下面三个运算符。

  • :逻辑取反运算符(改变单个表达式的真假)
  • &&:与运算符,就是并且的意思(全真则真,有假则假)
  • ||:或运算符,就是或者的意思(有真即真,全假即假)

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

3.1逻辑取反运算符!(单目操作符)

比如,我们有一个变量叫flag,如果flag为假,要做一个事情:

#include<stdio.h>
int main()
{
	int flag = 0;
	if (!flag)//if(flag == 0)
	{
		printf("do something\n");
	}
	return 0;
}

如果flag为真,!flag就是假,如果flag为假,!fag就是真,所以上面的代码的意思就是flag为假,执行 if 语句中的代码。

3.2与运算符(双目操作符)

        &&就是与运算符,使用方式是  a && b ,&&两边的表达式都是真的时候,整个表达式才为真,只要有一个是假,则这个表达式为假。(全真即真,有假即假)

比如:我们说月份3到5月是春天

#include<stdio.h>
int main()
{
	int month = 0;
	scanf("%d", &month);
	if (month >= 3 && month <= 5)//这里表达的意思就是month既要大于等于3,又要小于等于5,必须同时满足
	{
		printf("春季\n");
	}
}

3.3或运算符(双目操作符)

         ||运算符是或者的意思,使用方式是 a || b  。||两边的表达式只要有一个是真,整个表达式就是真,两边表达式都为假的时候,才为假。(全假则假,有真即真)

比如:我们说一年中,月份是12月或者1月或者2月是冬天

#include<stdio.h>
int main()
{
    int month = 0;
    scanf("%d", &month);
    if(month == 12 || month ==1 || month ==2)
    printf("冬季\n");
    return 0;
}

 练习:闰年的判断

输入一个年份year,判断year是否是闰年

闰年的判断规则:

  1. 能被4整除并且不能被100整除的是闰年
  2. 能被400整除的是闰年
#include<stdio.h>
int main()
{
	int year = 0;
	scanf("%d", &year);
	if ((year / 4 == 0 && year / 100 != 0) || (year / 400) == 0)
	{
		printf("%d是闰年\n", year);
	}
	else
		printf("%d不是闰年\n", year);
	return 0;
}

四. 逻辑运算符的特点——短路

        C语言逻辑运算符总是先对左侧的表达式求只,再对右边的表达式求值。如果左边的表达式满足逻辑运算符的条件,就不再对右边的表达式求值,这种情况称为“短路”。

如前面代码:

if (month >= 3 && month <= 5)

        表达式中的&& 的左操作数是month >= 3,右操作数 month <= 5,当左操作数month >= 3 的结果是0的时候,即便不判断 month <= 5 ,整个表达式的结果也是0(不是春季)。

所以,对于 && 操作符来说,左边操作数的结果是0的时候,右边操作数就不再执行。(遇到假停)

结合前面的代码,来讨论||的短路:

if (month ==12 || month ==1 || month ==2)

        如果month == 12,则不再判断month是否等于1或者2,整个表达式的结果也是1(是冬季)。

所以,||操作符的左操作数的结果不为0时,就无需执行右操作数。(遇到真停) 

         像这种仅仅根据左操作数的结果就能知道整个表达式的结果,不再对右操作数进行计算的运算称为短路求值

(前置++和后置++:https://blog.csdn.net/wait___wait/article/details/135242898?spm=1001.2014.3001.5502)

练习:阅读代码,计算代码输出的结果

#include<stdio.h>
int main()
{
	int i = 0, a = 0, b = 2,c =3, d = 4;
	i = a++ && ++b && d++;//该表达式是逻辑表达式,&&操作符会短路:遇到假停。
	//a++先使用再加1,返回0后a=1,返回值0为假,后边的操作数不再执行,
	printf("a=%d b=%d c=%d d=%d i=%d", a, b,c, d, i);
	return 0;
}

运行结果: 


#include<stdio.h>
int main()
{
	int i = 0, a = 0, b = 2,c =3, d = 4;
	i = a++ || ++b || d++;// ||操作符会短路:遇到真停。
	//a++先使用再加1,返回0后a=1,程序继续执行
	// ++b先加1后使用,b+1=3后返回1,返回值为真,后边的操作数不再执行,
	printf("a=%d b=%d c=%d d=%d i=%d", a, b,c, d, i);
	return 0;
}


欢迎斧正!!!

期待你的

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于Vite创建简单Vue3工程

首先安装node.js环境&#xff0c;没有node.js环境&#xff0c;便没有npm命令。 1、Vue3创建执行命令 D:\TABLE\test>npm create vuelatestVue.js - The Progressive JavaScript Framework√ 请输入项目名称&#xff1a; ... vue_test √ 是否使用 TypeScript 语法&#xff…

【C++】Windows编译FileZilla Client

按照Compiling FileZilla 3 under Windows - FileZilla Wiki (filezilla-project.org)操作即可。 1.下载安装MSYS2 msys2-x86_64-20220118.exe 2.更新MSYS2 进入MSYS2 MinGW 64-bit shell&#xff0c;运行 pacman -Syu重复退出shell&#xff0c;更新MSYS2。直到没有可更新…

【Maven】工程依赖下载失败错误解决

在使用 Maven 构建项目时&#xff0c;可能会发生依赖项下载错误的情况&#xff0c;主要原因有以下几种&#xff1a; 下载依赖时出现网络故障或仓库服务器宕机等原因&#xff0c;导致无法连接至 Maven 仓库&#xff0c;从而无法下载依赖。 依赖项的版本号或配置文件中的版本号错…

详解Vue3中的事件监听方式

本文主要介绍Vue3中的事件监听方式。 目录 一、v-on指令二、使用符号简写三、事件修饰符四、动态事件名五、常见的监听事件六、自定义事件 在Vue3中&#xff0c;事件监听的方式与Vue2有一些不同。 下面是Vue3中事件监听方式的详细介绍&#xff1a; 一、v-on指令 Vue3中仍然使…

[嵌入式AI从0开始到入土]9_yolov5在昇腾上推理

[嵌入式AI从0开始到入土]嵌入式AI系列教程 注&#xff1a;等我摸完鱼再把链接补上 可以关注我的B站号工具人呵呵的个人空间&#xff0c;后期会考虑出视频教程&#xff0c;务必催更&#xff0c;以防我变身鸽王。 第一章 昇腾Altas 200 DK上手 第二章 下载昇腾案例并运行 第三章…

OCP NVME SSD规范解读-3.NVMe管理命令-part2

NVMe-AD-8&#xff1a;在某些情况下&#xff08;如Sanitize命令、Format NVM命令或TCG Revert方法后数据被清除&#xff09;&#xff0c;设备应允许读取已清除的LBAs而不产生错误&#xff0c;并在最后一次清除完成后&#xff0c;对未写入LBAs的读取返回所有零值给主机 NVMe-AD…

【北亚数据恢复】mysql表被truncate,表数据被delete的数据恢复案例

云服务器数据恢复环境&#xff1a; 华为ECS云服务器&#xff0c;linux操作系统&#xff0c;mysql数据库&#xff08;innodb引擎&#xff09;。作为网站服务器使用。 云服务器故障&#xff1a; 在执行mysql数据库版本更新测试时&#xff0c;误将本应该在测试库上执行的sql脚本执…

【JavaScript】浮点数精度问题

✨ 专栏介绍 在现代Web开发中&#xff0c;JavaScript已经成为了不可或缺的一部分。它不仅可以为网页增加交互性和动态性&#xff0c;还可以在后端开发中使用Node.js构建高效的服务器端应用程序。作为一种灵活且易学的脚本语言&#xff0c;JavaScript具有广泛的应用场景&#x…

移动端开发框架mui代码在安卓模拟器上运行2(HbuilderX连接到模拟器)模拟器窗口及多开设置

开发工具 HBuilder X 3.8.12.20230817 注意&#xff1a;开发工具尽量用最新的或较新的。太旧的版本在开发调试过程中可能会出现莫名其妙的问题。 接上篇&#xff0c;移动端开发框架mui代码在安卓模拟器上运行&#xff08;HbuilderX连接到模拟器&#xff09;&#xff0c;这篇主要…

Mediapipe绘制实时3d铰接骨架图——Mediapipe实时姿态估计

一、前言 大约两年前&#xff0c;基于自己的理解我曾写了几篇关于Mediapipe的文章&#xff0c;似乎帮助到了一些人。这两年&#xff0c;忙于比赛、实习、毕业、工作和考研。上篇文章已经是一年多前发的了。这段时间收到很多私信和评论&#xff0c;请原谅无法一一回复了。我将尝…

HarmonyOS 实践之应用状态变量共享

平时在开发的过程中&#xff0c;我们会在应用中共享数据&#xff0c;在不同的页面间共享信息。虽然常用的共享信息&#xff0c;也可以通过不同页面中组件间信息共享的方式&#xff0c;但有时使用应用级别的状态管理会让开发工作变得简单。 根据不同的使用场景&#xff0c;ArkTS…

HarmonyOS 组件通用属性之通用事件 文档参数讲解(触摸事件)

好 本文 我们来说说触摸事件 字面意思也非常好理解 就是我们手机手指触摸物体触发 我们先在编辑器组件介绍中 找到这个东西的基本用法 Button("跳转").onTouch((event: TouchEvent) > {})最明显的就是 event 的类型变了 点击事件的是 ClickEvent 而这里是 Touc…

14 2023.12.31 --------release--------misc--------

呵呵 一部分 misc 存在草稿箱好久了 而且 也并没有那么重要, 直接放出去吧 今年的 专业技能方面的收获主要是一些方面 linux 方面, 这部分内容主要是集中在上半年 90 telnet 连接上对方服务之后 立即 “Connection closed by foreign host.“ 89 重写 /proc/sys/vm/nr_pd…

【LMM 002】大型语言和视觉助手 LLaVA-1.5

论文标题&#xff1a;Improved Baselines with Visual Instruction Tuning 论文作者&#xff1a;Haotian Liu, Chunyuan Li, Yuheng Li, Yong Jae Lee 作者单位&#xff1a;University of Wisconsin-Madison, Microsoft Research, Columbia University 论文原文&#xff1a;htt…

win/linux 环境查看动态库包含的函数

我们打包了动态库&#xff0c;还要查看是否包含一些函数&#xff0c;需要导出这些函数 在win 环境下可以使用 .def 格式的文件进行操作 ######################################################### 跳过这一步&#xff0c;回到主题&#xff0c;在两个系统平台如何查看动态库包…

LanceDB:在对抗数据复杂性战役中,您可信赖的坐骑

LanceDB 建立在 Lance&#xff08;一种开源列式数据格式&#xff09;之上&#xff0c;具有一些有趣的功能&#xff0c;使其对 AI/ML 具有吸引力。例如&#xff0c;LanceDB 支持显式和隐式矢量化&#xff0c;能够处理各种数据类型。LanceDB 与 PyTorch 和 TensorFlow 等领先的 M…

图文证明 等价无穷小替换

等价无穷小替换 定义 等价无穷小是无穷小之间的一种关系&#xff0c;指的是&#xff1a;在同一自变量的趋向过程中&#xff0c;若两个无穷小之比的极限为1&#xff0c;则称这两个无穷小是等价的。无穷小等价关系刻画的是两个无穷小趋向于零的速度是相等的。 设当 x → x 0 时…

第5课 使用openCV捕获摄像头并实现预览功能

这节课我们开始利用ffmpeg和opencv来实现一个rtmp推流端。推流端的最基本功能其实就两个:预览画面并将画面和声音合并后推送到rtmp服务器。 一、FFmpeg API 推流的一般过程 1.引入ffmpeg库&#xff1a;在代码中引入ffmpeg库&#xff0c;以便使用其提供的功能。 2.捕获摄像头…

条款14:在资源管理类中小心拷贝行为

你可能会发现&#xff0c;有时候需要创建自己的资源管理类。例如&#xff0c;假设你正在使用一个C API来操作互斥对象&#xff0c;互斥类型提供了lock和unlock函数: void lock(Mutex* pm); // 锁住pm指向的互斥量 void unlock(Mutex* pm); // 互斥量解锁 class Lock { publi…

【LMM 003】生物医学领域的垂直类大型多模态模型 LLaVA-Med

论文标题&#xff1a;LLaVA-Med: Training a Large Language-and-Vision Assistant for Biomedicine in One Day 论文作者&#xff1a;Chunyuan Li∗, Cliff Wong∗, Sheng Zhang∗, Naoto Usuyama, Haotian Liu, Jianwei Yang Tristan Naumann, Hoifung Poon, Jianfeng Gao 作…
最新文章