第五章 操作符和表达式





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





总结:

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

短路求值(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. Android技术路线图

    邮件问题: 老师你好,我从去年就在看你的关于Android的视频了,的确讲的不错,去年看了一段时间,寒假的时候回家重新复习了一下Java基础知识,开学的时候看到你又陆续出了一些视频,这段时间看完了,跟 ...

  2. 关于uitableView的Group模式滑动偏移问题

    问题: uitableView的group模式自带一个section的headerView,如果不调整,系统就会默认高度,在滑动时就会向下偏移一个单位的scetion高度,我们改变tableView的 ...

  3. CSDN-Markdown语法集锦

    前言: 使用Markdown近一个来月.越来越认为不舒爽. 改字体.改字号.改颜色.改样式,全不会!想加个数学公式.得,仅仅会截图.把图片传上去了还不会控制大小.也不会控制文字与图片的排版,写出来的博 ...

  4. ADB命令解析

    ADB全称Android Debug Bridge, 是android sdk里的一个工具, 用这个工具可以直接操作管理android模拟器或者真实的andriod设备(手机). 它的主要功能有: * ...

  5. hibernate某些版本(4.3)下报错 NoSuchMethodError: javax.persistence.Table.indexes()

    其实本来没啥大问题,但到网上查的时候发现了一些误人子弟的说法,所以还是记下来吧. 现象: hibernate从低版本升级到某一个版本时(我们是升到4.3.10)时,在程序启动时会报错: java.la ...

  6. 移动平台前端开发总结(针对iphone,Android等手机)

    移动平台前端开发是指针对高端智能手机(如Iphone.Android)做站点适配也就是WebApp,并非是针对普通手机开发Wap 2.0,所以在阅读本篇文章以前,你需要对webkit内核的浏览器有一定 ...

  7. android开发工具类总结(一)

    一.日志工具类 Log.java public class L { private L() { /* 不可被实例化 */ throw new UnsupportedOperationException ...

  8. dojo.byId、dojo.query、dojo.attr

    概述: dojo.byId(/*string*/id或/*DomNode*/node) 1.传入DOMNode返回传入的domNode; 2.传入id返回id为当前值的domNode dojo.que ...

  9. 定时排程刷新微信access-token

    微信公众号开发中最常遇到的就是调用接口时候需要有API的access-token(非网页授权的access-token),有了这个token之后,才可以发生模板消息等.这里的做法主要是用nodejs的 ...

  10. 在C#实现托盘效果(转)

    桌面程序的开发中,经常考虑能在状态栏实现托盘快捷操作,托盘程序的实现在API时代,还是相对复杂的,首先在MSDN中可以查看其函数细节, 然后在根据其要求的参数进行复杂的设置.      在.NET时代 ...