1. float x 等于0: if((x<0.000001)&&(x>-0.000001))
- 一般float型只能精確到小數(shù)到后六位即1e-6,將float型的數(shù)x的絕對(duì)值abs(x)與1e-6比較,如果abs(x)比1e-6還要小的話就可以認(rèn)為x的值為零,因?yàn)樾?shù)六位以后是不精確的,是沒(méi)有意義的。
比如數(shù)0.0000001雖然確實(shí)不等于零,但是第七位小數(shù)1是沒(méi)有意義的就可以認(rèn)為這個(gè)數(shù)等于0。 - float,double分別遵循R32-24,R64-53的標(biāo)準(zhǔn)。所以float的精度誤差在1e-6;double精度誤差在1e-15 。所以要判斷一個(gè)單精度浮點(diǎn)數(shù)是否為0:則是if( abs(f) < 1e-6);要判斷一個(gè)雙精度浮點(diǎn)數(shù)是否為0:則是if( abs(d) < 1e-15 );
2. 宏定義
#define MAX(a,b) (((a)>(b))?(a):(b))
#define MIN(a,b) (((a)<(b))?(a):(b))
#define DOUBLE(x) ((x)+(x))
3. 用printf函數(shù)顯示調(diào)試信息
//#define __DEBUG_MSG
#ifdef __DEBUG_MSG
#define DEBUG_MSG printf
#else
#define DEBUG_MSG()
#endif
4. x%(2^n) = x-((x>>n)<<n)
5. 在C/C++里數(shù)組str作為參數(shù)時(shí)傳遞的實(shí)際上是指向數(shù)組第一個(gè)元素的指針。因此sizeof(str)返回的是指針的大小,即4。
- 以下形式的參數(shù)是完全等價(jià)的:
void Func(char str[100]); void Func(char str[]); void Func(char *str); void Func(char *(str+100));
6.指針p+n 指向(p的地址+n*sizeof(p的數(shù)據(jù)類型))
7.指針、數(shù)組與函數(shù)
int a ; 一個(gè)整形數(shù)
int *p; 一個(gè)指向整形數(shù)的指針
int **p; 一個(gè)指向指針的指針,它指向的指針指向一個(gè)整形數(shù)
int a[10]; 一個(gè)有10個(gè)整形數(shù)元素的數(shù)組
int *a[10]; 一個(gè)有十個(gè)指針元素的數(shù)組(指針數(shù)組),每個(gè)元素都指向一個(gè)整形數(shù)
int (*p)[10]; 一個(gè)指針(數(shù)組指針),指向一個(gè)有十個(gè)整形數(shù)元素的數(shù)組
int *f(int); 一個(gè)函數(shù)(指針函數(shù)),返回值是一個(gè)地址(指針)
int (*p)(int); 一個(gè)指針(函數(shù)指針),指向一個(gè)返回整形數(shù)值的函數(shù)
int (*a[10])(int); 一個(gè)有十個(gè)指針(函數(shù)指針)元素的數(shù)組,每個(gè)元素都指向一個(gè)函數(shù)
8. 絕對(duì)地址的操作
-
向絕對(duì)地址0x100000 寫(xiě)值
*(unsigned int*)0x100000 = 0x1234; -
程序跳轉(zhuǎn)到絕對(duì)地址0x100000去執(zhí)行
void (*main)(void); main = (void*)0x100000; main(); or *((void *)0x100000) ();