逻辑运算符和逻辑表达式详解
目录
- 引入
- 逻辑运算符和逻辑表达式
- 例子
- 注意事项(短路特性)
引入
首先,我们思考一个问题:
if (fabs(data2) <= 1e - 7)
是否等同于下面这个语句:
if (-1e - 7 <= data2 <= 1e - 7)
众所周知,数学上的表达式a > b > c是“a大于b并且b大于c”的意思。但是,在C语言中,a > b > c这种表达式虽然没错,但在逻辑上面却并不能表达“a大于b并且b大于c”的意思。
在C语言中,用1表示表达式的值为真,用0表示表达式的值为假,并且关系运算符具有左结合性,因此,若假设a,b,c的值分别为3,2,1,那么a > b > c的计算过程则为:a > b > c <=> (a > b) > c = 1 > c = 0(假)。所以说,**在数学上正确的表达式在C语言的逻辑上不一定总是正确的。**因此,上面的两个语句并不等价。
逻辑运算符和逻辑表达式
1、逻辑运算符
C语言中的逻辑运算也称为布尔运算,C语言提供的逻辑运算符如下:
逻辑运算符 | 类型 | 含义 | 优先级 | 结合性 |
---|---|---|---|---|
! | 单目运算符 | 逻辑非 | 最高 | 从右向左 |
&& | 双目运算符 | 逻辑与 | 较高 | 从左向右 |
II | 双目运算符 | 逻辑或 | 较低 | 从左向右 |
注意:
这三个逻辑运算符的优先级各不相同。其中,运算符!只需要一个操作数,所以叫单目运算符,也叫一元运算符,因为一元运算符的优先级比其他运算符高,所以表中!的优先级最高,其次是&&,再次是II。
2、逻辑表达式
用逻辑运算符连接操作数组成的表达式称为逻辑表达式。逻辑表达式的值,即逻辑运算的结果值同样只有真和假两个值,C语言规定用1表示为真,用0表示假。但是在需要判断一个数值表达式(不一定是逻辑表达式)真假的时候,**由于任意一个数值表达式的值不只局限于0和1两种情况,因此根据表达式的值为非0还是0来判断其真假。若果表达式的值为非0,则表示为真,如果表达式的值为0,则表示为假。只是大多时候用1和0表示真假。**逻辑运算规则如下:
A的取值 | B的取值 | !A(逻辑非) | A && B(逻辑与) | A II B(逻辑或) |
---|---|---|---|---|
非0 | 非0 | 0 | 1 | 1 |
非0 | 0 | 0 | 0 | 1 |
0 | 非0 | 1 | 0 | 1 |
0 | 0 | 1 | 0 | 0 |
运算法则:
1、逻辑与运算的特点是:仅当两个操作数都为真的时候,运算结果才为真;只要有一个为假,运算结果就为假。简记(一假则假,否则为真)
因此,当要表示两个条件必须同时成立,即“…,并且…”这样的条件时,可使用逻辑与运算符来连接这两个条件。
2、逻辑或运算的特点是:两个操作数中只有一个为真,运算结果为真;仅当两个操作数都为假,运算结果才为假。简记(一真则真,否则为假)
因此,当需要表达“或者…或者…”这样的条件时,可使用逻辑或运算符来连接这两个条件。
3、逻辑非运算的特点:若操作数的值为真,则其逻辑非运算的结果为假;反之,则为真。简记(若真则假,若假则真)
了解完这些逻辑运算符和表达式后,我们再来看上面说过的数学表达式a > b > c,那么用C语言就应该表示为:
(a > b) && (b > c)
同理,下面两条语句也是等价的:
if (fabs(data2) <= 1e - 7) if (data2 >= -1e - 7 && data2 <= 1e - 7)
例子
下面再举个常见的例子
判断某一年year是否是闰年?
那么需要满足以下两个条件:
(1)能被4整除,但不能被100整除
(2)能被400整除
用代码实现即:
((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0)/*带括号的写法*/
year % 4 == 0 && year % 100 != 0 || year % 400 == 0/*无括号写法*/
以上两种写法是等价的,但第二种需要明确各种运算符的优先级才能正确对其进行计算,而前者加上括号后计算的先后顺序一目了然,即使忘记了各种运算符的优先级,也能对其正确计算。
之所以如此,是因为在C语言中,圆括号也是一种运算符,而且它的优先级永远是最高的。因此,如果表达式中的运算符较多,则宜用圆括号来确定表达式的计算顺序,这样可以避免使用默认的优先级。
注意事项(短路特性)
运算符&&和||都具有“短路”特性。也就是说,若含有逻辑运算符(&&和||)的表达式的值可由先计算的做操作数的值单独推导出出来,那么将不再计算有操作数的值,这意味着表达式中的某些操作数可能不会被计算。
例如,在逻辑表达式a > 1 && b++ > 2中,仅当前面的表达式a > 1为真时,后面表达式b++ > 2中的b++才会被计算。反之,若改成b++ > 2 && a > 1,则b++ 就一定会被计算了。当然,更好的办法是单独对b进行自增计算。
因此,为了保证运算的正确性,提高程序的可读性,良好的程序设计风格不建议在程序使用多用途、复杂而晦涩难懂的复合表达式。
以上就为大家总结了C语言的逻辑运算符和逻辑表达式,最后的注意事项一定要记住噢,还得下去多练,多操作就会很快记住啦!如果大家在读完这篇博客后有所帮助,请给我点个赞关注一下吧!谢谢大家了。如果有什么问题,可以在下方评论,或者加我QQ:1423759736,我会及时回复的!
逻辑运算符和逻辑表达式详解相关推荐
- Linux Shell 逻辑运算符、逻辑表达式详解
2019独角兽企业重金招聘Python工程师标准>>> shell的逻辑运算符 涉及有以下几种类型,因此只要适当选择,可以解决我们很多复杂的判断,达到事半功倍效果. 一.逻辑运算符 ...
- 逻辑表达式是否合法_Linux shell 逻辑运算符、逻辑表达式详解
转自 | talkwithtrend 作者 | db2haodb shell的逻辑运算符 涉及有以下几种类型,因此只要适当选择,可以解决我们很多复杂的判断,达到事半功倍效果. 一.逻辑运算符 1.逻辑 ...
- 逻辑运算符及其优先级,C语言逻辑运算符及其优先级详解
C 语言提供了以下三种逻辑运算符. 一元:!(逻辑非). 二元:&&(逻辑与).||(逻辑或). 以上三种逻辑运算符中,逻辑非 ! 的优先级最高,逻辑与 && 次之,逻 ...
- Java中的运算符——逻辑运算符详解
逻辑运算符主要包括逻辑与( & ),逻辑或( | ),逻辑异或( ^ ),短路与( && ),短路或( || ).所有逻辑运算符的特点是操作数都是布尔类型,并且最终的运算结果也 ...
- JAVA逻辑运算符示例详解:与、或、非、异或
JAVA逻辑运算符示例详解:与.或.非.异或 对比表 与 逻辑与 短路与 或 逻辑或 短路或 非 逻辑非 异或 逻辑异或 对比表 与(仅左右语句都为真时为真)包括:逻辑与& 和 短路与& ...
- linux之find命令详解
find命令是用来在给定的目录下查找符合给定条件的文件 find命令格式: find path -option [ -print | -ls | -delete | -fls /PATH/T ...
- python流程控制语句-python学习 流程控制语句详解
###################### 分支语句 python3.5 ################ #代码的缩进格式很重要 建议4个空格来控制 #根据逻辑值(True,Flase)判断程序的 ...
- EL表达式 JSTL(详解)
相关JSTL.EL博客收集如下: JSTL 标签大全详解:http://blog.csdn.net/qq_25827845/article/details/53311722 EL表达式详解:http: ...
- java json path_Java使用JSONPath解析JSON完整内容详解
JsonPath是一种简单的方法来提取给定JSON文档的部分内容. JsonPath有许多编程语言,如Javascript,Python和PHP,Java. JsonPath提供的json解析非常强大 ...
最新文章
- 用机器学习神器sklearn做特征工程!
- STL priority_queue sort 自定义比较终极模板
- boost::fusion::make_map用法的测试程序
- python基础(part1)--注释/变量/del语句
- 【整理】fiddler不能监听 localhost和 127.0.0.1的问题
- pb 数据窗口 *号隐藏_王者荣耀背后的腾讯自研数据库TcaplusDB实践
- Qt QCompleter自动补全
- 模拟器xposed框架安装7.1-64教程
- rows between unbounded preceding and current row等,unbounded ,preceding ,following,current row含义详解
- 一、mysql数据库基本框架
- MySQL数据库的核心MVCC详解
- 北京化工大学数据结构2022/10/27作业 题解
- python:scipy.optimize.minimize(method=’Nelder-Mead’)
- W: Possible missing firmware /lib/firmware/i915/kbl_guc_ver9_14.bin for module i915
- 文件服务器建立,文件服务器建立
- Zero-sho原先的升级版:hourglass网络:U-Net
- Analog Noise
- 餐饮酒店的存酒卡怎么使用,开发一款存酒卡的微信小程序,var d = new Date(“2021-03-12“);
- CAS、AtomicInteger、synchronized原理
- 单播 、多播(组播)、广播
热门文章
- 解决app一打开白屏和黑屏的问题
- eggjs 创建应用知识点
- Bison教你3分钟集成支付宝好友分享
- 关于 Chrome插件安装时程序包无效:CRX_HEADER_INVALID 的解决方法
- python搜题手机软件_智慧职教APPPython程序设计(深圳信息职业技术学院)答案搜题公众号...
- 百度地图坐标转换为gps_百度地图与中交兴路合作,为大卡司机提供专业导航服务...
- 关于周华健,我觉得有那么几个时期:-转
- 什么是物理路径、相对路径、绝对路径、根目录------java初学者学习笔记
- 从事Java开发主要就业方向有哪些?
- 视觉无人机高速公路违章检测——分析要点,整体框图