第五章 操作符和表达式





这一章假设没做过玩过单片机、汇编的话,读起来可能比較吃力,尤其是在移位运算符、位运算符应用上。另外多注意一下左值和右值的理解。





总结:

算术操作符、赋值操作符、关系操作符、条件操作符。

短路求值(short-circuited evalution):如||这种二目操作符,假设它的左操作数是真,右操作数便不再求值。带来的后果是假设右操作数的数组下标不合法,那么也不会报错。

C并不具备显式得布尔类型,布尔值是用整型表达式来表示的。在表达式中混用布尔值和随意的整型值可能会产生错误。要避免这些错误,每一个变量要么表示成布尔型,要么表示成整型,不可让它身兼两值。不要对整形变量进行布尔測试,反之亦然。

C没有布尔,用整数取代。0为假,非0为真。

所以有的人常常这样:

#define FALSE 0

#define TRUE 1

..

if(flag == TRUE)...

if(flag)...

可是这样意义不大,假设flag设置为随意的整型值,那么第二对语句就不是等价的,仅仅有当flag确实是True或者False才有意义。

因此假设flag你希望它来代表布尔值,就应该始终把它设置为0或者1。

左值和右值(L-value和R-value),左值往往提供一个内存的位置,但并非一份拷贝。右值代表一个值,能够是一份拷贝。所以左值也能够是右值,可是右值不能成为左值。

比方:

a++ =b://wrong

b =a++; //right

a++并没有一个内存位置,有人会说a++必定会存在一个内存的位置,可是a++的结果是a的一份拷贝,其位置不certain。所以这个不是左值。

不同类型之间的值须要转换才干操作。

假设某个表达式过于依赖求值的顺序,那么应该尽力去避免,由于不同的编译器会产生不同的求值顺序,所以本质上表达式是不可移植的。





警告:

1、有符号值得右移位值操作时不可移植的。

这对编译器是一个考验,全部无符号的右移同左移一样,他是可移植的,可是假设存在有符号位的右移位操作,假设符号位是1,右移的全是1,假设符号位是0,右移的全是0。

2、移位操作的位数是个负值。

3、连续赋值中各个变量长度不一。

4、误用=而不是==进行比較。

太easy错误了,所以仅仅要有逻辑表达式最好多看一便。

5、误用|替代||,误用&替代&&

位操作符,误用80%出错!

6、在不同的用于表示布尔值的非零值之间进行比較。

见上详述。

7、表达式赋值的位置并不决定表达式计算的精度。

8、编写结果依赖于求值顺序的表达式。

见上!





编程提示:

1、尝试使用下面条件操作符替代if语句以简化表达式。

这样带来的优势非常明显,当一个表达式过长的时候,?:;的组合降大大缩短长度。

2、不要混用整型和布尔值。





关于位操作符。。。。嗯嗯,以后有时间在关注它的应用。

C和指针 (pointers on C)——第五章:操作符和表达式的更多相关文章

  1. 《C和指针》读书笔记——第五章 操作符和表达式

    1.当/操作符的两个操作数都是整数时,它执行整除运算:其他都是执行浮点数除法. 2.逻辑移位:左边移入的位用0填充: 算数移位:左边移入的位用符号位填充: 3.位置1 :value |= 1<& ...

  2. 《Pointers On C》读书笔记(第五章 操作符和表达式)

    1.C语言操作符优先级表 2.算术操作符中%(取模操作符)只适用于整型类型,其余几个操作符(+.-.*./)既适用于整型类型也适用于浮点类型.当/操作符的两个操作数都是整型时,它执行整除运算,其它情况 ...

  3. 《C和指针》读书笔记 第5章-操作符和表达式

    原创文章,转载请注明出处:http://www.cnblogs.com/DayByDay/p/3936503.html

  4. 深入理解 C 指针阅读笔记 -- 第五章

    Chapter5.h #ifndef __CHAPTER_5_ #define __CHAPTER_5_ /*<深入理解C指针>学习笔记 -- 第五章*/ /*不应该改动的字符串就应该用 ...

  5. C语言学习书籍推荐《C和指针 Pointers On C》下载

    <C和指针 POINTERS ON C>提供与C语言编程相关的全面资源和深入讨论.本书通过对指针的基础知识和高 级特性的探讨,帮助程序员把指针的强大功能融入到自己的程序中去.  全书共18 ...

  6. 《Linux内核设计与实现》读书笔记 第五章 系统调用

    第五章系统调用 系统调用是用户进程与内核进行交互的接口.为了保护系统稳定可靠,避免应用程序恣意忘形. 5.1与内核通信 系统调用在用户空间进程和硬件设备间添加了一个中间层, 作用:为用户空间提供了一种 ...

  7. 《Linux内核设计与实现》课本第五章学习笔记——20135203齐岳

    <Linux内核设计与实现>课本第五章学习笔记 By20135203齐岳 与内核通信 用户空间进程和硬件设备之间通过系统调用来交互,其主要作用有三个. 为用户空间提供了硬件的抽象接口. 保 ...

  8. 《java编程思想》读书笔记(一)开篇&第五章(1)

    2017 ---新篇章  今天终于找到阅读<java编程思想>这本书方法了,表示打开了一个新世界. 第一章:对象导论 内容不多但也有20页,主要是对整本书的一个概括.因为已经有过完整JAV ...

  9. 《LINUX内核设计与实现》读书笔记之第五章

    第五章——系统调用 5.1 与内核通信 1.为用户空间提供一种硬件的抽象接口 2.保证系统稳定和安全 3.除异常和陷入,是内核唯一的合法入口. API.POSIX和C库 关于Unix接口设计:提供机制 ...

随机推荐

  1. $.cookie is not a function

    在调试网站的时候,用jquery获取cookie时,报错: $.cookie is not a function; 一般情况$.cookie is not a function;错误原因: 一.没有引 ...

  2. iOS https认证 && SSL/TLS证书申请

    1.下面列出截止2016年底市面上常见的免费CA证书: 腾讯云SSL证书管理(赛门铁克TrustAsia DV SSL证书)阿里云云盾证书服务(赛门铁克DV SSL证书)百度云SSL证书服务Let's ...

  3. JDK5新特性之线程同步集合(五)

    一. 传统集合: 传统方式下的Collection在迭代集合时, 不同意对集合进行改动: public class CollectionModifyExceptionTest { public sta ...

  4. weblogic8.1在myeclipse中启动正常,在单独的weblogic中无法正常启动的解决方案.

    应用程序服务器weblogic8.1.5,项目在myeclipse中启动正常,在单独的服务器中启动就报错了.错误如下图: 经过观察,发现在myeclipse中设置了以下的jar包.估计是这个问题引起的 ...

  5. STL之nth_element()(取容器中的第n大值)

    nth_element()函数 头文件:#include<algorithm> 作用:nth_element作用为求第n大的元素,并把它放在第n位置上,下标是从0開始计数的,也就是说求第0 ...

  6. AAC ADTS解析

    1.ADTS ADTS全称是(Audio Data Transport Stream),是AAC的一种十分常见的传输格式. 一般的AAC解码器都需要把AAC的ES流打包成ADTS的格式,一般是在AAC ...

  7. for循环、穷举法和迭代

    循环:初始条件,循环条件,状态改变,循环体.for(初始条件;循环条件;状态改变){ 循环体}for(int i=1;i<=10;i++){ }例子:100以内与7有关的数.求100以内所有数的 ...

  8. 关于ASP.NET 中站点地图sitemap 的使用

    在ASP.NET  MVC 如此火热的时期,我竟然不适时宜的谈起ASP.NET ,恐怕会引来一阵嘲笑.最为无趣的是,讲解的竟然还是其中的一个控件.oh~~  my god!my out! ^_^ Si ...

  9. SQL事务机制

    一.事务概念     事务是一种机制.是一种操作序列,它包含了一组数据库操作命令,这组命令要么全部执行,要么全部不执行.因此事务是一个不可分割的工作逻辑单元.在数据库系统上执行并发操作时事务是作为最小 ...

  10. 控制器的view的加载优先级

    拿到控制器后,控制器的view是在什么时候按照什么优先级创建加载的? 1.控制器内部的view是延迟加载 1> 用到时再加载(loadView) 2> 加载完毕后会调用控制器的viewDi ...