C与指针的第五章介绍了操作符,包含算数(+、-、、/、%)、移位(>>、<<)、位(&、|、^)、(复合)赋值(+=、-=、=、/=、%=、<<=、>>=、&=、|=、 ^=)、单目(!、++、-、&、sizeof、~、–、*、(类型))、关系(>、>=、<、<=、!=、==)、逻辑(&&、!!)、条件(1 ? 2 : 3 )、逗号( 1, 2)、下标引用([ ])、函数调用(函数名和实参)和结构成员(.和->)。经查漏,要补缺的点如下:
1.负数是正数的二进制经取反加1得到的;
2.算术右移用原先的符号位填充空出来的位;
3.符号扩充(在保持值不变的前提下,将原数转换为32位或64位):用符号位填充高位;
4.符号位:0表示正,1代表负;
5.关系运算符的结果是0或1;
6.C语言没有布尔型,在表达式中混用布尔值或整型值会出现错误。解决方法是:每个变量要么表示布尔型,要么表示整型,不要让它身兼两职。
7.1<=a<=10,不要写这样的语句,应写为a>=1 && a <=10;
8.运算符的优先级:括号>单目>算术>关系>位运算>逻辑>条件>赋值>复合赋值>逗号;
9.符号位也参与位运算,这一点务必注意;
10.复合赋值运算符的优先级值得注意:
a+= expression;//等价于a = a + (expression),括号内先运算,即便包含
比加法优先级低的操作符。
书中给出的警告:
1.有符号值的右移位操作是不可移植的(不同的编译器可能会在逻辑移位和算术移位中二选一,而这不能确定);
2.移位操作的位数是负数;
3.连续赋值中各个变量的长度不一;(这样会造成截断,影响变量精度)
4.误用=而不是==进行比较;
5误用|代替||,误用&代替&&;
6.在不同的用于表示布尔值和非零值之间进行比较;
7.表达式赋值的位置并不决定表达式计算的精度;例1:
int a=5000;
int b = 25;
long c = a*b;
在16位机器中,c的值会溢出,解决方法是在进行乘法运算前把其中一个或两个操作数转换为长整型。
long c = long(a) * b;
8.编写结果依赖于求值顺序的表达式。
书中给出的编程提示:
1.使用复合赋值符可以使程序易于维护;
2.使用条件操作符替代if语句以简化表达式;
3.使用逗号操作符来消除多余的代码;
4.不要混用整型和布尔型。