第五章 操作符和表达式





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





总结:

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

短路求值(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. java编译相关问题总结

    参考:http://jingyan.baidu.com/article/5bbb5a1b080f6113eba179f0.html 1.在linux下生成的class文件/jar包,拿到windows ...

  2. 带你走近AngularJS - 创建自己定义指令

    带你走近AngularJS系列: 带你走近AngularJS - 基本功能介绍 带你走近AngularJS - 体验指令实例 带你走近AngularJS - 创建自己定义指令 ------------ ...

  3. 命令行分析java线程CPU占用

    1.使用top命令找出占用cpu最高的JAVA进程pid号 2. 找出占用cpu最高的线程: top -Hp  -n 1 3. 打印占CPU最高JAVA进程pid的堆栈信息 jstack pid &g ...

  4. java学习笔记day06---匿名内部类

    1.匿名内部类:其实就是内部类的简化形式,它所体现的就是一个类或者接口的子类对象.前提:     内部类必须继承或实现外部类或接口. 格式:    new 父类&接口(){};    其实就是 ...

  5. Flashback Version/Transaction Query

    1.应用Flashback Version Query查询记修改版本 SQL> select dbms_flashback.get_system_change_number from dual; ...

  6. andeoid硬件解码学习 (二)

    Finally, I must say, finally, we get low-level media APIs in Android, the Android hardware decoding ...

  7. 【Java基础】构造方法调用构造方法

    从一个程序开始: class dog { private String name; private String color; private int age; dog(String name) // ...

  8. word 中巧妙添加分隔线

  9. SQL SERVER中如何格式化日期(转)

    原文地址:http://blog.sina.com.cn/s/blog_95cfa64601018obo.html   1. SELECT convert(varchar, getdate(), 10 ...

  10. JQ动画 show hide

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...