C語言高階 25 和 操作符使用分析

2021-08-20 03:45:04 字數 1833 閱讀 5519

#運算子

#運算子用在預處理器期間將巨集引數轉換為字串

#的轉換作用是在預處理器完成的,因此只在巨集定義中有效

編譯器不知道#的轉換作用

用法:

#define string(x) #x

printf("%s\n", string(hello world!)); //注意,並沒有出現雙引號

對於下面**:

#include #define string(x) #x

int main()

單步編譯:gcc -e test.c -o test.i

printf("%s\n", "hello world!");

printf("%s\n", "100");

printf("%s\n", "while");

printf("%s\n", "return");

觀察下面**:

#include #define call(f, p) (printf("call function %s\n", #f), f(p))  //列印了呼叫函式的函式名

int square(int n)

int func(int x)

int main()

linux下使用gcc編譯執行:

~/will$ ./a.out

call function square

result = 16

call function func

result = 10

單步編譯觀察巨集被預處理後的樣子:

result = (printf("call function %s\n", "square"), square(4));

result = (printf("call function %s\n", "func"), func(10));

##運算子

##運算子用於在預處理階段粘連兩個識別符號

##的連線作用是在預處理器完成的,因此只在巨集定義中有效;

用法:

#define connect(a,b) a##b

int connect(a,1); // int a1

a1 = 2;

觀察下面**:

//#include #define name(n) name##n

int main()

單步編譯:gcc -e 25-3.c -o 25-3.i
int main()

#include #define struct(type) typedef struct _tag_##type type;\

struct _tag_##type

struct(student)

;int main()

單步編譯:

typedef struct _tag_student student; struct _tag_student

;

小結:

#運算子用在預處理器期間將巨集引數轉換為字串

##運算子用於在預處理階段粘連兩個識別符號

編譯器不知道#和##的存在

#和##只在巨集定義中存在

c語言 位操作符和邏輯操作符

按位與 按位或 按位異或 注 他們的運算元必須是整數。兩個整數字元位有假 0 就為假 0 只有全為真 1 就為真 1 舉個例子 老師叫兩個學生來辦公室,說張三與 李四過來,如果只乙個人過去就不滿足老師說的話 為假 必須兩個人都過去 為真 兩個整數字元位只要有真就為真,只有全為假 0 就為假 0 舉個...

c語言操作符 位操作符 移位操作符

1 按位操作符 1.1 按位 與 雙目運算子 僅當兩個運算元都為1時,結果為1,否則為0。參與運算的數以補碼方式出現。例 9 5 1 0000 1001 9的補碼 0000 0101 5的補碼 0000 0001 1的補碼 應用 a 通常將某些位清零或保留某些位。例如 將a的高八位清零,保留低八位,...

C語言 , 操作符

例如 define to string s s 將會使編譯器把以下命令 cout to string hello world endl 理解為cout hello world endl 例如 define concatenate x,y x y int xy 10 將會使編譯器把 cout conc...