C語(yǔ)言奇技淫巧40則
使用逗號(hào)運(yùn)算符在一個(gè)語(yǔ)句中實(shí)現(xiàn)多個(gè)操作。例如:
a = 1, b = 2, c = 3;
使用條件運(yùn)算符代替if語(yǔ)句來(lái)簡(jiǎn)化代碼。例如:
x = (y > 5) ? 10 : 20;
使用位運(yùn)算符來(lái)執(zhí)行位操作。例如:
x = 1 << 3;
使用指針來(lái)訪問(wèn)數(shù)組元素。例如:
*(array + i) = 10;
使用宏定義來(lái)定義常量和函數(shù)。例如:
#define PI 3.14159
使用預(yù)處理器指令來(lái)控制編譯器。例如:
#ifdef DEBUG printf("Debugging mode\n");
使用靜態(tài)變量來(lái)在函數(shù)調(diào)用之間共享變量。例如:
static int count = 0;
使用枚舉類型來(lái)定義常量。例如:
enum {RED, GREEN, BLUE};
使用結(jié)構(gòu)體來(lái)組織數(shù)據(jù)。例如:
struct student { char name[20]; int age; };
使用指針來(lái)動(dòng)態(tài)分配內(nèi)存。例如:
int *p = (int*) malloc(sizeof(int));
使用遞歸函數(shù)來(lái)解決復(fù)雜的問(wèn)題。例如:
int factorial(int n) { return (n == 0) ? 1 : n * factorial(n-1); }
使用函數(shù)指針來(lái)調(diào)用不同的函數(shù)。例如:
void (*function_ptr)(int) = &my_function; function_ptr(10);
使用聯(lián)合體來(lái)在同一內(nèi)存空間中存儲(chǔ)不同的數(shù)據(jù)類型。例如:
union my_union { int i; float f; };
使用inline函數(shù)來(lái)提高代碼的性能。例如:
inline int square(int x) { return x * x; }
使用可變參數(shù)函數(shù)來(lái)接受不同數(shù)量和類型的參數(shù)。例如:
int sum(int count, ...) { va_list args; va_start(args, count); int result = 0; for(int i = 0; i < count; i++) { result += va_arg(args, int); } va_end(args); return result; }
使用函數(shù)宏來(lái)實(shí)現(xiàn)代碼復(fù)用。例如:
#define SQUARE(x) ((x) * (x))
使用goto語(yǔ)句來(lái)跳轉(zhuǎn)到程序中的標(biāo)簽。例如:
goto end_of_function; ... end_of_function: return 0;
使用位域來(lái)壓縮數(shù)據(jù)。例如:
struct flags { unsigned int flag1: 1; unsigned int flag2: 1; unsigned int flag3: 1; };
使用指針數(shù)組來(lái)處理字符串。例如:
char *strings[] = {"one", "two", "three"}; printf("%s", strings[1]);
使用多維數(shù)組來(lái)表示矩陣。例如:
int matrix[3][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
使用條件編譯指令來(lái)根據(jù)不同的條件編譯不同的代碼。例如:
#if DEBUG ... #endif
使用typedef關(guān)鍵字來(lái)定義自定義類型。例如:
typedef int my_integer;
使用無(wú)限循環(huán)來(lái)創(chuàng)建類似于死循環(huán)的代碼。例如:
while(1) { ... }
使用do-while循環(huán)來(lái)確保代碼至少執(zhí)行一次。例如:
do { ... } while(condition);
使用unsigned類型來(lái)存儲(chǔ)非負(fù)數(shù)。例如:
unsigned int x = 10;
使用volatile關(guān)鍵字來(lái)確保變量被正確地讀取和寫(xiě)入。例如:
volatile int x = 10;
使用指針運(yùn)算符來(lái)訪問(wèn)結(jié)構(gòu)體的成員。例如:
struct my_struct { int x; int y; }; struct my_struct *ptr; ptr->x = 10;
使用memcpy函數(shù)來(lái)復(fù)制內(nèi)存塊。例如:
int dest[5]; int src[5] = {1, 2, 3, 4, 5}; memcpy(dest, src, sizeof(int) * 5);
使用條件編譯指令來(lái)支持不同的操作系統(tǒng)或編譯器。例如:
#ifdef _WIN32 ... #endif
使用函數(shù)指針數(shù)組來(lái)執(zhí)行不同的函數(shù)。例如:
void (*functions[3])(int) = {&function1, &function2, &function3}; functions[1](10);
使用帶標(biāo)簽的break語(yǔ)句來(lái)跳出多層循環(huán)。例如:
for(int i = 0; i < 10; i++) { for(int j = 0; j < 10; j++) { if(condition) { goto end_of_loop; } } } end_of_loop: ...
使用指針運(yùn)算符和數(shù)組下標(biāo)來(lái)遍歷字符串。例如:
char *str = "hello"; for(int i = 0; str[i] != '\0'; i++) { printf("%c\n", str[i]); }
使用__func__預(yù)定義宏來(lái)獲取當(dāng)前函數(shù)的名稱。例如:
printf("Function name: %s\n", __func__);
使用函數(shù)指針作為函數(shù)參數(shù)來(lái)實(shí)現(xiàn)回調(diào)函數(shù)。例如:
void my_function(int x, void (*callback)(int)) { ... }
使用逗號(hào)運(yùn)算符來(lái)執(zhí)行多個(gè)操作。例如:
int x = 1, y = 2, z = (x++, y++, x + y);
(z的值為3,x和y的值分別為2和3)使用union來(lái)創(chuàng)建聯(lián)合體類型,可以在不同的數(shù)據(jù)類型之間共享內(nèi)存。例如:
union my_union { int x; float y; };
使用條件運(yùn)算符(三目運(yùn)算符)來(lái)進(jìn)行條件判斷和賦值。例如:
int x = (condition) ? 10 : 20;
使用靜態(tài)變量來(lái)保留函數(shù)調(diào)用之間的狀態(tài)信息。例如:
void my_function() { static int counter = 0; counter++; printf("Counter: %d\n", counter); }
使用inline關(guān)鍵字來(lái)將函數(shù)的定義嵌入到調(diào)用點(diǎn)。例如:
inline int my_function(int x) { return x * x; }
使用#和##預(yù)處理運(yùn)算符來(lái)動(dòng)態(tài)地生成標(biāo)識(shí)符和符號(hào)。例如:
#define CONCAT(x, y) x ## y
(CONCAT(a, b)將會(huì)被替換為ab)