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.編寫結果依賴於求值順序的表達式
表達式的求值順序由三個因素影響:
操做符的優先級
操做符的結合性
操做符是否控制執行順序
操做符的優先級決定了相鄰的操做符哪一個先被執行,若是優先級相等,那麼結合性決定執行順序,
可是,這些並不能徹底決定表達式的求值順序,編譯器只要不違背優先級和結合性規則,能夠自由決定複雜表達式的求值順序。因此若是,表達式的結果依賴於求值順序,那麼,本質上是不可移植的,避免使用。