C被许多人诟病的一个缺点就是它品种繁多的操作符,同时也正是许多操作符具有其他语言的操作符无法抗衡的价值,这也是C适用于开发范围极广的应用程序的原因之一。
1.操作符
1)算术操作符: + - * / %;
2)移位操作符:左移位操作符<<,右移位操作符>>;
3)位操作符:与(&)、或(|)、异或(^);
4)赋值:复合赋值符 +=、-=、*=、/=、%=、<<=、>>=、&=、^=、|=;
5)单目操作符:!(取反)、++、-、&(取址符)、sizeof、~(取补)、--、+、*(间接访问符,与指针一起使用)、(类型,如(float)a);
6)关系操作符:>、>=、<、<=、!=、==;
7)逻辑操作符:&&、||;
8)条件操作符:ex1 ? ex2 : ex3,条件操作符的优先级非常低;
9)逗号操作符:ex1,ex2,......,exN;
10)下标引用、函数调用和结构成员:a[N],s->a,s.a;
2.布尔值
C并不具备显式的布尔类型,所以使用整型来代替。其规则是:零是假,任何非零值皆为真。
3.左值和右值
左值就是那些能够出现在赋值符号左边的东西,右值就是那些可以出现在赋值符号右边的东西。
4.表达式求值
1)隐式类型转换:总是以缺省整型类型的精度来进行的。
2)算术转换:long double,double,float,unsigned long int,long int,unsigned int,int;若某个操作数的类型在上面这个列表中排较低,那么它首先将转换为另一个操作数的类型然后执行操作。
3)操作符的属性: 复杂表达式的求值顺序是由3个因素决定的:操作符的优先级、操作符的结合性以及操作符是否控制执行的顺序。
4)优先级和求值的顺序:两个相邻操作符的符的执行顺序由它们的优先级决定,如果它们的优先级相同,它们的执行顺序由它们的结合性决定。除此之外,编译器可以自由决定使用任何顺序对表达式进行求值,只要它不违背逗号、&&、||和?:操作符所施加的限制。
5.警告的总结
1)有符号值的右移位操作是不可移植的;
2)移位操作的位数是负值;
3)连续赋值中各个变量的长度不一;
4)误用=而不是==进行比较;
5)误用|代替||,误用&代替&&;
6)在不同的用于表示布尔值的非零值之间进行比较;
7)表达式赋值的位置并不决定表达式计算的精度;
8)编写结果依赖于求值顺序的表达式;
6.编程提示的总结
1)使用复合赋值符可以使程序更易于维护;
2)使用条件操作符替代if语句以简化表达式;
3)使用逗号操作符来消除多余代码;
4)不要混用整型和布尔型值;