目录

逻辑运算符有哪些?

逻辑运算符的短路特性

逻辑运算符在表达式求值中的问题

逻辑运算符&&、||混合的不同情况


逻辑运算符有哪些?

C 语言提供了以下三种逻辑运算符。

一元:!(逻辑非)。

二元:&&(逻辑与)、||(逻辑或)。

以上三种逻辑运算符中,逻辑非 ! 的优先级最高,逻辑与 && 次之,逻辑或  ||  优先级最低。即算术、逻辑、赋值运算符的优先级顺序为:

逻辑非 !   >   算术   >   逻辑与 &&    >    逻辑或 ||    >    赋值=

逻辑表达式的值为逻辑值,即布尔型(bool),该类型为 C99 新增的,一些编译器可能还不支持该类型。
逻辑值分为逻辑真值和逻辑假值。一般情况下,在判断时,仅有零值被判断为逻辑假值(false),一切非零值均可被判断为逻辑真值(true);在存储和表示时,通常,使用 1 表示逻辑真值,0表示逻辑假值。
逻辑与 && 运算符的运算规则:只有两个操作数均为逻辑真时,结果才为真。其余情况,结果均为假。
逻辑或 || 运算符的运算规则:只有两个操作数均为逻辑假时,结果才为假。其余情况,结果均为真。

例如,设有定义语句

int a=3,b=5;

则有:

!a:由于 a 非零,为真,!a 为假,其值为 0。

a||b:由于 a 和 b 均非零,均为真,故逻辑或的结果为真,其值为 1。

a&&b:由于 a 和 b 均非零,均为真,故逻辑与的结果为真,其值为 1。

!a||b&&2:由于逻辑非 ! 优先级最高,首先与 a 结合,而 && 优先级高于 ||,相当于(!a)||(b&&2), 即 0||1 为真,其值为 1。

此外,&&和||还有“短路”的特性

逻辑运算符的短路特性

逻辑与 &&、逻辑或 || 均有“短路”特性:

逻辑与&&“短路”:当逻辑与&&的左操作数为逻辑假时,就足以判断该逻辑运算的结果为假了,故右操作数就不再被执行。

逻辑或||“短路”:当逻辑或||的左操作数为逻辑真时,就足以判断该逻辑运算的结果为真了,故右操作数就不再被执行。

例如:

int a=1,b=2,c;

c=a||++b;

printf("a=%d,b=%d,c=%d\n",a,b,c);

由于 a 为非零值,即为真,而当逻辑或 || 的左操作数为真时,就足以判断该逻辑操作的结果为真。故发生“短路”,即右操作数 ++b 不被执行。输出结果为:a=1,b=2,c=1。

注:我们在看|| &&的问题时  应该将问题看为 ■||■   ■&&■ 的问题

其中,■可以是a、b、x、y这样的一个变量也可以是1、2、’a’这样的整型常量,还可以是整体的一个表达式语句 例如(a+b)、++a,将表达式看成整体■ 更方便且更准确我们去区分“短路问题”


逻辑运算符在表达式求值中的问题

这是简单的逻辑短路,我们再看看复杂一点的问题

公布答案:

从结果我们可以看出,只有x的值发生了变化

疑问: &&的优先级不是高于||吗 为什么不是先计算&&,所以按道理y和z的值都改变才对不是吗?

我们再看  将++y&&++z 用括号括起来

()的优先级够高吧,并且将整体括了起来,可是结果表明 括号里面完全没有计算啊?

由此看出 优先级 在逻辑表达式中并没有起到优先的作用

即 在含有逻辑表达式的表达式求值中,运算符的优先级并不影响逻辑运算符求值顺序

其实,优先级只是改变了结合顺序,但并不改变运算顺序

引入谭浩强的“短路法则”

c把先计算哪部分的决定权留个设计者,但&&和||是例外,c语言保证&&和||的求值顺序是从左到右,一旦发现某个元素让表达式无效立即停止运算(短路法则)。”

在上述问题中

表达式相当于:++x || (++y&&++z)
&&优先级确实是高,所以,(++y&&++z)做为一个整体■。
而||的规则就是,左侧为true,右侧不执行。 所以,即便是++x || (),右面是括号,优先级最高,也是先执行||左侧的。   等同于   ■||■  的问题


有点感觉了吧!趁热打铁,再看一个复杂的例子

分析以下程序,输出其运行结果。

int main(void)
{int a=0,b=2,c;c=!a||++b&&a--;printf("a=%d,b=%d,c=%d\n",a,b,c);return 0;
}

代码分析:
混合表达式 c=!a||++b&&a-- 中含有的运算符有逻辑非 !、逻辑或 ||、逻辑与 &&、算术前缀 ++、算术后缀 --、赋值号 = 等6个运算符。逻辑运算符、算术运算符、赋值运算符的优先级的关系为:

逻辑非!     >       算术     >      逻辑与&&    >     逻辑或 ||       >      赋值 =

由于该表达式中赋值运算符优先级最低,故最后赋值。
根据优先级的高低,表达式 !a||++b&&a-- 等价于 (!a)||((++b)&&(a--)),而逻辑或 || 的左操作数 !a 为真,此时足以判断该表达式的值为真。故发生“短路”,即 || 的整个右操作数 ((++b)&&(a--)) 不再被执行。

运行结果为:
a=0,b=2,c=1

所以该问题实际上还是短路法则的问题,运算符优先级不影响。


到此,相信你已经对&& ||的运算问题已经有了很深刻的理解

逻辑运算符&&、||混合的不同情况

以下是对该类问题的不同类型区分结果

情况一:

#include<stdio.h>
int main()
{int a=1,b=2,c=3,ans;ans=a++&&++b&&++c;printf("ans=%d,a=%d,b=%d,c=%d\n",ans,a,b,c);return 0;
}

注意 a虽然是后++ 但执行完也改变了哦!

情况二:

#include<stdio.h>
int main()
{int a=1,b=2,c=3,ans;ans=++a&&++b||++c;printf("ans=%d,a=%d,b=%d,c=%d\n",ans,a,b,c);return 0;
}

ans=++a&&++b||++c; 相当于   ans=(++a&&++b)||++c;

所以c的值不变

情况三:

#include<stdio.h>
int main()
{int a=1,b=2,c=3,ans;ans=++a&&(++b||++c);printf("ans=%d,a=%d,b=%d,c=%d\n",ans,a,b,c);return 0;
}

&&后半部分得到++b的值就可以了 所以c还是不变

情况四:

#include<stdio.h>
int main()
{int a=0,b=2,c=3,ans;ans=a&&(++b||++c);printf("ans=%d,a=%d,b=%d,c=%d\n",ans,a,b,c);return 0;
}

和之前的问题一样,()并不改变&&运算顺序

所以得到a=0后就停止运算了

情况五:

#include<stdio.h>
int main()
{int a=0,b=2,c=3,ans;ans=a||(++b&&++c);printf("ans=%d,a=%d,b=%d,c=%d\n",ans,a,b,c);return 0;
}

和之前不一样哦,这里a=0了,所以会判断&&

ans=a||++b&&++c;  不加括号的结果也一样哦

但是注意 结合顺序并不是  ans=(a||++b)&&++c;

!!这里虽然结果一样,但只是巧合!!

比如

#include<stdio.h>
int main()
{int a=1,b=2,c=3,ans;ans=++a||++b&&c++;printf("ans=%d,a=%d,b=%d,c=%d\n",ans,a,b,c);return 0;
}

应该看作 ans=++a||(++b&&c++);   所以 a的值改变 b c都不会改变

但是如果看做 ans=(++a||++b)&&c++;   则a、c改变 b的值不会改变

牢记 优先级只是改变了结合顺序,但并不改变运算顺序

内容都是自己原创,属实不易,未经允许请勿擅自转载哦!

祝你学习进步,生活愉快~

C语言逻辑运算符和||,一篇文章带你读懂逻辑表达式!相关推荐

  1. java ee 值范围_一篇文章带你读懂: Java EE

    原标题:一篇文章带你读懂: Java EE 点击上图,查看教学大纲 何为 Java EE Java EE是一个标准中间件体系结构 不要被名称"Java PlatformEnterprise ...

  2. 无线充电技术究竟有何神秘之处?一篇文章带你读懂什么是无线充电技术

    无线充电技术这个概念在很早之前就已经被提出了,发展至今在电子领域已经被深入研究应用,虽然还未曾大范围普及,但在消费电子领域的发展已经取得不错的成绩.手机厂商也纷纷在自家旗舰机上加入这一革新性的先进充电 ...

  3. 一篇文章带你读懂JSP的使用的理解

    JSP语言是干嘛的呢?一句话:就是在html中编写java代码.能够直接在页面中运行并编译,能够访问已经存在的类接口等,在jsp中的java与你在后台写的java功能一样.相比servlet中,我们响 ...

  4. 一篇文章带你读懂批处理命令

    批处理,顾名思义,批量处理,它可以将复杂的事情变得简单,最早出现在dos操作系统中,也就是我们经常说的cmd黑窗口,这在早期没有gui界面的时候用的是最多的,而且命令比较丰富,虽然现在有很多功能都被封 ...

  5. 强连接运营社张强:一篇文章带你读懂私域流量的本质和玩法

    "私域流量"越来越火! 身边很多商家朋友都在布局这个事情,但提起"私域流量",大家仍然茫然不知所措- "私域不就是建立一些个人微信号?把会员从线下门店 ...

  6. 两个必看协议-最全面-最直接-最暴力-一篇文章带你读懂-HTTP、HTTPS

    Web服务基础知识 我们每天都会用web客户端上网,浏览器就是一个web客户端,例如谷歌浏览器,以及火狐浏览器等. 当我们输入https://blog.csdn.net/xie_qi_chao时候,很 ...

  7. 一篇文章带你读懂Python的魔法方法

    作者:Python进阶者 来源:Python爬虫与数据挖掘 今 日 鸡 汤 燕雀安知鸿鹄之志哉? /1 前言/ 魔法方法是python 里面非常重要的一个分支,平时我们写代码或多或少都会接触到他们,而 ...

  8. 一篇文章带你读懂 MySQL 和 InnoDB

    作者 | Draveness  原文地址 | http://draveness.me/mysql-innodb.html 作为一名开发人员,在日常的工作中会难以避免地接触到数据库,无论是基于文件的 s ...

  9. 一篇文章带你读懂真正的大数据公司

    马云卸任演讲时说了这么一句话:很多人还没有搞清楚什么是PC互联网,移动互联网来了,我们还没有搞清楚移动互联网的时候,大数据时代又来了. 现在的数据,可谓是时下最炙手可热的东西了.想当年,有" ...

  10. 一篇文章带你搞懂网络层(网际层)-- 地址篇

    网络层(Network Layer)是OSI模型中的第三层(TCP/IP模型中的网际层),提供路由和寻址的功能,使两终端系统能够互连且决定最佳路径,并具有一定的拥塞控制和流量控制的能力.相当于发送邮件 ...

最新文章

  1. U盘安装Ubuntu14.4时遇到分区问题记录
  2. .ini文件的读写操作
  3. SLF4J: Failed to load class org.slf4j.impl.StaticLoggerBinder
  4. excel同一单元格怎么换行_excel表格内怎么换行 方法有两种 一看就会 新手教程...
  5. Screenium 3 for Mac - 强大的屏幕录制编辑器
  6. 做任务云闪付为什么要实名认证_ISO9001质量体系认证:为什么要做?如何去做?...
  7. easyswoole的安装
  8. ipadmini1iOS9.3.5降级8.4.1教程
  9. matlab最小二乘法解超定方程,超定方程和最小二乘法
  10. 《游牧者的抉择》读书笔记
  11. c语言ans作用,C语言的递归思想实例分析
  12. 车规电阻AEC-Q200测试项目及元器件检测设备
  13. 数据库审计方案简介和功能对比
  14. C#在vs中吧数据流直接打印到txt文件
  15. 阿里笔试模拟题-74.钱庄
  16. c++11:计算时间差(毫秒)
  17. Go语言为什么值得学习?
  18. linux su命令卡顿,linux su特别慢问题排查
  19. ZEALER王自如品味逼格感悟
  20. mysql中vlookup函数_数据库合并函数vlookup介绍

热门文章

  1. 酷家乐服务网格与Serverless落地情况
  2. Python 用sympy做高数题,不定积分、定积分、极限、求导样样精通!
  3. html敲tab键无法新建,sublime按tab键无法补全html页面模板解决办法
  4. Excel小技巧--如何禁止在某一列或某一区域输入重复内容
  5. java工作日和节假日判断
  6. Mutect2​案例 / 有或没有正常样本配对的肿瘤体细胞变异检测结果对比
  7. 拼写的能力和重要性英语作文_拼写很重要吗? 我认为是的。
  8. 鼠标右键没有word、excel/右键不能新建word、ppt等office
  9. c语言求圆柱的底面积和体积,计算圆柱的底面积和体积
  10. springboot jpa 实体类继承