1.有符号的值得右移位操做是不可移植的blog
2.移位操做的位数是个负数,是未定义的编译器
3.连续赋值的各个变量的长度 不一,致使变量值截断。io
#include <stdio.h> int main() { char chr_num; int int_num; //截断 int_num = chr_num = 100000; return 0; }
编译器提示:编译
4.条件语句勿用=代替==class
5.勿用 | 代替||, & 代替 &&变量
6.不一样的用于表示布尔值的非零值之间进行比较。float
#define FALSE 0 #define TRUE 1 //若是flag为任意整型值,那么下面两个语句是不等价的 if(flag == TRUE) { } if(flag) { }
避免混合使用整型值和布尔值。im
7.表达式赋值的位置并不决定表达式的计算精度。d3
若是某个操做符的各个操做数属于不一样的类型,那么除非其中一个操做数转换为另一个操做数的类型,不然操做数没法进行。img
寻常算术转换 long double double float unsigned long int long int unsigned int int
若是某个操做数排名较低,那么它首先转换为另一个操做数的类型,而后执行操做。
例如 在16位的机器上
int a = 5000; int b = 100; long c = a * b;
会发生溢出,须要将a * b的结果转换为长整型。
int a = 5000; int b = 100; long c = (long) a * b;
8.编写结果依赖于求值顺序的表达式
表达式的求值顺序由三个因素影响:
操做符的优先级
操做符的结合性
操做符是否控制执行顺序
操做符的优先级决定了相邻的操做符哪一个先被执行,若是优先级相等,那么结合性决定执行顺序,
可是,这些并不能彻底决定表达式的求值顺序,编译器只要不违背优先级和结合性规则,能够自由决定复杂表达式的求值顺序。因此若是,表达式的结果依赖于求值顺序,那么,本质上是不可移植的,避免使用。