C和指针 (pointers on C)——第五章:操作符和表达式

第五章 操作符和表达式

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

总结:

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

短路求值(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、误用=而不是==进行比较。

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

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

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

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

见上详述。

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

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

见上!

编程提示:

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

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

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

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

C和指针 (pointers on C)——第五章:操作符和表达式

时间: 2024-10-11 05:23:41

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

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

<C和指针 POINTERS ON C>提供与C语言编程相关的全面资源和深入讨论.本书通过对指针的基础知识和高 级特性的探讨,帮助程序员把指针的强大功能融入到自己的程序中去.  全书共18章,覆盖了数据.语句.操作符和表达式.指针.函数.数组.字符串.结构和联合等几乎所有重要的C编程话题.书中给出了很多编程技巧和提示,每章后面有针对性很强的练习,附录部分则给出了部分练习的解答.  本书适合C语言初学者和初级c程序员阅读,也可作为计算机专业学生学习c语言的参考. 下载地址:点我 编辑推荐 本书通

C Primer Plus (第五版) 第五章 编程练习

第五章 运算符.表达式和语句 编程练习 1.编写一个程序.将用分钟表示的时间转换成以小时和分钟表示的时间.使用#define或者const来创建一个代表60的符号常量.使用while循环来允许用户重复键入值,并且当键入一个小于等于0的时间时终止循环. #include <stdio.h> #define H 60 int main(void) { //此处注释部分在程序中等价于#define //const int H = 60; int m; printf("请输入分钟(输入0退出

C和指针 (pointers on C)——第十五章:输入输出函数

第十五章 输入输出函数 这一章读完的第一感觉就是"呵呵". 如果说上过C语言课,基本上scanf()/printf()算是用的比较熟练了.尤其是那些抽象的格式说明.还有scanf()为什么要加括号. 读过本书前面的内容的话,getchar(),putchar(),gets(),puts()这些应该也问题不大. 再如果的话,你学过计算机图形学,你玩过OpenGL,听说过双缓存机制,那么fflush()也肯定弄明白了. 再加上FILE的操作,输入输出定位刷新删除改名,流的概念. 这一章就会

C和指针 (pointers on C)——第一章:快速上手

不太苟同大多数人认为很多程序员没有几个学C学的好的,那就多看看这本书. 本人只是作为读书笔记来写.有时候会附带一些题目和解答. 开通此类专栏,既为敲砖引玉,也为自勉,望鼓励! 第一章:快速上手 我每次都是复习的来写.我想是这一章,哪怕是上手也需要有一定的C基础. 总结:提出了stdio.h中一些基本的函数,如scanf(),printf(),getchar(),putchar(),gets(),puts()等io函数. 关于NULL和NUL的区别也说了一些. NUL也就是字符串中的截尾字符'\n

C和指针 (pointers on C)——第二章:基本概念

第二章 基本概念 不良的代码风格,不良的文档直接导致软件开发及维护代价高昂. 其实一个人总有他自己的代码风格,主要是坚持一种合理的风格,让大家容易读懂. 总结: C是一种对大小写非常敏感的语言,所以Abc,abc这是两个不同的标识符.长度没有限制,但是31个字符以后会自动忽略. 程序的起点是main函数,绝大多数环境使用堆栈来存储局部变量和其他数据. 注释必需以/* 开始,*/结束,不允许嵌套.注释将被预处理器去除. 标识由字符数字和下划线组成,不能以数字开头,大写和小写不同. 关键字不能作为标

JS复习第五章

第五章 引用类型 一.Object类型 创建object实例的方式有两种. 第一种是使用new操作符后跟object构造函数,如下所示: ver person = new Object( ) ; person.name = “Nicholas” ; person.age = 29 ; 另一种方式是使用对象字面量表示法: var person = { name : “Nicholas”, age : 29 } ; 对象字面量是向函数传递大量可选参数的首选形式. function displayIn

JavaScript高级程序设计(第3版)第五章读书笔记

第五章 引用类型 创建Object实例的方式有两种,第一种是使用new操作符后跟Object构造函数,例如: var person = new Object( ); person.name = “Nicholas”; person.age=29; 第二种是使用对象字面量表示法.如: var person = { name : “Nicholas”, age : 29 }; 在最后一个属性后面添加逗号,会在IE7及更早版本和Opera中导致错误. 两种访问对象属性的方法,一是方括号语法,例如per

现代编译原理--第五章(活动记录)

(转载请表明出处  http://www.cnblogs.com/BlackWalnut/p/4559245.html ) 第五章是到目前位置最让我头疼的一章,不是因为难,是因为对最终的目的不太明确.整章前半部分用十分精简的语言介绍了一个新的概念,活动记录,也就是在函数调用时,一个调用栈究竟发生了什么事.但是,在最终编码实现过程中,总不能理解作者为什么给了这些变量?或者说,完全不知道作者究竟想让我完成一个怎样的功能.纠结了好几天,后来索性往后继续看,看看能不能找到其他的线索.直到看完后一章,硬着

第十五章 文件属性类的实现

                  第十五章    文件属性类的实现        根用户的权限也不能是无限大.必须考虑到保护用户的隐私!用户的文件内容.程序代码可设置为根用户也不能观看,只能是文件拥有者可以查看.修改.但根用户可以删除一切非根用户的文件.也可以查看用户的目录.所以,i_mode字符更改如下:      BU16 i_mode; // 描述文件的访问权限:文件的读.写.执行权限  // i_mode.15-13  ftype; 文件类型: 0-符号软连接文件, // 1-硬连接文