C语言进阶—— 逻辑运算符分析15
印象中的逻辑运算符:
---学生:老师,在我的印象中,逻辑运算符用在条件判断的时候,真挺简单的,还有必要深究吗?
---老师:逻辑运算符确实在条件判断的时候用的比较多,但是并不能说简单。。。
请思考下面的示例:
#include <stdio.h> int main()
{
int i = ;
int j = ;
int k = ; ++i || ++j && ++k; printf("%d\n", i);
printf("%d\n", j);
printf("%d\n", k); return ;
}
我们分析一下第九行的代码,逻辑与&&的优先级更高,应该限制性++j和++k,然后根据短路原则,++i不用执行,但是真的是这样吗?
运行结果和我们分析的完全相反,为什么呢,逻辑与的优先级是更高啊!
程序中的短路:
--- || 从左向右开始计算:
- 当遇到为真的条件时停止计算,整个表达式为真
- 当所有条件为假的时候表达式才为假
--- && 从左往右开始计算:
- 当遇到条件为假的时候停止计算,整个表达式为假
- 当所有条件为真时表达式才为真
咦?短路原则需要遵循从左往右开始计算,那么是不是与我们认可的优先级原则矛盾呢?
其实没有:逻辑表达式中,毫无疑问 && 比 || 具有更高的优先级
其实上面例子中的第九行代码可以稍微改变一下结构 ++i || ++j && ++k; >>>>> (++i) || (++j && ++k); >>>>> (true&& ++i) || (++j && ++k);
在 && 和 || 混合运算的时候,整个表达式被看做 || 表达式,编译器从左向右开始计算每一个 && 表达式(遵循了优先级原则),当某个 && 表达式的值为真的时候,停止计算,整个表达式的值为真。
理解完了上面的代码可以尝试着看一下这段代码:
#include <stdio.h> int g = ; int f()
{
printf("In f()...\n"); return g++;
} int main()
{
if( g || f() && f() )
{
printf("In if statement: %d\n", g);
} printf("In main(): %d\n", g); return ;
}
具体的分析思路和上面一样!
还有一种逻辑运算符 “!” 它究竟是什么呢?
C预言中的逻辑非 !只认得0,只知道见了0就返回1.因此当其碰见的值不是0时,其结果为0.
示例:
#include <stdio.h> int main()
{
printf("%d\n", !);
printf("%d\n", !);
printf("%d\n", !);
printf("%d\n", !-); return ;
}
这段代码的运行结果就很好的说明了逻辑非!运算符只认得0。
小结:
- 程序中的逻辑表达式遵从短路规则
- 在 && 与 || 和混合运算时:
- --真个整个表达式被看做 || 表达式
- --从左向右先计算 && 表达式
- --最后计算 || 表达式
- 逻辑非!运算符只认得0
- --碰见0返回1,否则统统返回0,也就是说在C语言中只有0才代表假,其余的所有值均代表真。
C语言进阶—— 逻辑运算符分析15的更多相关文章
- 《C语言进阶剖析》课程目录
<C语言进阶剖析>学习笔记 本文总结自狄泰软件学院唐佐林老师的<C语言 ...
- 【R笔记】R语言进阶之4:数据整形(reshape)
R语言进阶之4:数据整形(reshape) 2013-05-31 10:15 xxx 网易博客 字号:T | T 从不同途径得到的数据的组织方式是多种多样的,很多数据都要经过整理才能进行有效的分析,数 ...
- 03 java语言基础逻辑运算符
03.01_Java语言基础(逻辑运算符的基本用法) A:逻辑运算符有哪些 &,|,^,! &&,|| B:案例演示 逻辑运算符的基本用法 注意事项: a:逻辑运算符一般用于连 ...
- C语言的本质(15)——C语言的函数接口入门
C语言的本质(15)--C语言的函数接口 函数的调用者和其实现者之间存在一个协议,在调用函数之前,调用者要为实现者提供某些条件,在函数返回时,实现者完成调用者需要的功能. 函数接口通过函数名,参数和返 ...
- 利用R语言打造量化分析平台
利用R语言打造量化分析平台 具体利用quantmod包实现对股票的量化分析 1.#1.API读取在线行情2.#加载quantmod包3.if(!require(quantmod)){4. instal ...
- Go语言源码分析之unsafe
Go语言源码分析之unsafe 1.什么是unsafe unsafe 库让 golang 可以像C语言一样操作计算机内存,但这并不是golang推荐使用的,能不用尽量不用,就像它的名字所表达的一样,它 ...
- Solr4.8.0源码分析(15) 之 SolrCloud索引深入(2)
Solr4.8.0源码分析(15) 之 SolrCloud索引深入(2) 上一节主要介绍了SolrCloud分布式索引的整体流程图以及索引链的实现,那么本节开始将分别介绍三个索引过程即LogUpdat ...
- R语言重要数据集分析研究——需要整理分析阐明理念
1.R语言重要数据集分析研究需要整理分析阐明理念? 上一节讲了R语言作图,本节来讲讲当你拿到一个数据集的时候如何下手分析,数据分析的第一步,探索性数据分析. 统计量,即统计学里面关注的数据集的几个指标 ...
- Go语言的前景分析
本文为原创文章,转载注明出处,asdfasdfasdf 欢迎扫码关注公众号flysnow_org或者网站http://www.flysnow.org/,第一时间看后续精彩文章.觉得好的话,顺手分享到朋 ...
随机推荐
- Android 切换主题换肤实现
思路以及实现 1.主题的切换以及实现 首先我们先来明确个概念,现在我所说的切换主题,就切换整个app的颜色风格,当然也有少部分的图片的切换.注意哦 我这边说的是少部分图片哦!如果是大面积的换图片的吧! ...
- UIWindow及程序启动的过程
1. UIWindow才有自发显示的功能, 一个程序之所以能显示东西,是因为有window !// [self.window makeKeyAndVisible]; 2. 任何view的显示 ...
- 多路复用select poll epoll
I/O 多路复用之select.poll.epoll详解 select,poll,epoll都是IO多路复用的机制.I/O多路复用就是通过一种机制,一个进程可以监视多个描述符,一旦某个描述符就绪(一般 ...
- SonarQube代码质量管理平台介绍与搭建
前 言 1.SonarQube的介绍 SonarQube是一个管理代码质量的开放平台. 可以从七个维度检测代码质量(为什么要用SonarQube): (1) 复杂度分布(complexity):代码复 ...
- centos7.3上用源代码安装zabbix3.2.7
安装zabbix之前请自行先搭建好LAMP环境! 1.下载源码安装包并解压 1.1 下载 [root@nmserver- ~]# mkdir zabbix [root@nmserver- ~]# cd ...
- April 3 2017 Week 14 Monday
Don't worry about finding your soul mate. Find yourself. 欲寻佳侣,先觅本心. You may fail to find your soul m ...
- 怎样下载YouTube 4K视频
随着科技的进步,人们生活水平的提高,视频的清晰度也越来越高,以前那个观看模糊视频的时代已经一去不复返了.从最开始的720P和1080P高清视频,再到2K,进而到如今的4K(即3840×2160)极清视 ...
- jrtplib源码分析 第一篇 jthread的编译与分析
第一篇 jthread的编译与分析 jrtplib代码依赖库jthread,因此先从jthread开始jrtplib的学习.首先从以下链接下载jthread的源代码http://research.ed ...
- P1980 计数问题
题目描述 试计算在区间 11 到 nn的所有整数中,数字x(0 ≤ x ≤ 9)x(0≤x≤9)共出现了多少次?例如,在 11到1111中,即在 1,2,3,4,5,6,7,8,9,10,111,2, ...
- IntelliJ IDEA / Eclipse 自动生成 Author 注释 签名
Author 注释 签名如下: /*** @author 稚枭天卓 E-mail:zhxiaotianzhuo@163.com* @version 创建时间:2016-6-20 下午04:58:52* ...