当前位置:网站首页>C陷阱与缺陷 第3章 语义“陷阱” 3.8 运算符&&、||和!
C陷阱与缺陷 第3章 语义“陷阱” 3.8 运算符&&、||和!
2022-07-29 02:48:00 【weixin_客子光阴】
运算法&&、||和!
C语言中有两类逻辑运算符,某些时候可以互换:按位运算符&、|和~,以及逻辑运算符&&、||和!。
如果程序员用其中一类的某个运算符替换掉另一类中对应的运算符,他也许会大吃一惊:互换之后程序看上去还能“正常”工作,但实际上这只是巧合所致。
按位运算符&、|和~对操作数的处理方式是将其视作一个二进制的位序列,分别对齐每个位进行操作。
&运算符表示当且仅当两个操作数的二进制表示的某位上同时是1时,最后结果的二进制表示中该位才是1。
逻辑运算符&&、||和!对操作数的处理方式是:要么将其视为“真”,要么将其视为“假”,而非0视作“真”。
这些运算符当结果为“真”时返回1,当结果为“假”时返回0,它们只可能返回0或1。除次之外,
运算符&&和运算符||在左侧操作数的值能够确定最终结果时,根本不会对右侧操作数求值。
在表中查询一个特定的元素
i = 0;
while (i < tabsize && tab[i] != x) {
i++;
}
用意是:如果i等于tabsize则循环终止,这说明在表中没有发现要找的元素;而如果是其他情况,此时i的是找的元素的索引。注意在这个循环中用到了不对称边界。
i = 0;
while (i < tabsize & tab[i] != x) {
i++;
}
这个循环语句也有可能“正常”工作,但仅仅是因为两个非常侥幸的原因。
第一个“侥幸”是,while中的表达式&运算符的两侧都是比较运算,而比较结果在为“真”是等于1,在为“假”时等于0。只要x和y的取值都限制在0或1,x&y与x&&y就总是得出相同的结果。然而,如果两个比较运算符中的任何一个用除1之外的非0代表“真”,那么这个循环就不能正常运行了。
第二个“侥幸”是,对于数组结尾之后的下一个元素(实际上是不存在的),只要程序不去改变该元素的值,而仅仅读取它的值,一般情况下不会有什么危害的。运算符&和运算符&&不同,运算符&两侧的操作数都必须被求值。
对于数组结尾之后的下一个元素,取它的地址是合法的。这在一节中,我们试图去实际地读取这个元素的值,这种做法的结果是未定义的,而且绝少有C编译器能够检测出这个问题。
边栏推荐
猜你喜欢
MySql的安装配置超详细教程与简单的建库建表方法
DHCP protocol detailed analysis
Look at robot education and lead the mainstream of quality education
Notes on the seventh day
看机器人教育引领素质教育主流
Analysis of Project-based Learning Creativity in steam Education
瀚高数据库最佳实践配置工具HG_BP日志采集内容
MySQL compound query (important)
Day 5 experiment
混淆矩阵学习笔记
随机推荐
HTB-Blocky
Implementation principle of golang synergy
STP protocol (spanning tree protocol)
MongoDB索引 (3)
Source code of Jiugongge heart puzzle Applet / source code of main wechat applet with traffic
STP协议(生成树协议)
HTB-Blocky
SQL查询数据之多表(关联)查询
MySql的安装配置超详细教程与简单的建库建表方法
Thirty years of MPEG audio coding
Look at robot education and lead the mainstream of quality education
三子棋(玩家+电脑)
The basic concept of the origin and connotation of maker Education
Flink kernel source code (VII) Flink SQL submission process
Cloud development workers must go to work fishing and paddling wechat applet source code
C语言:小乐乐与欧几里得
DHCP protocol detailed analysis
The origin of Nacos' name
每周推荐短视频:如何让产品开发更加有效?
Analysis of Project-based Learning Creativity in steam Education