#運算子
#運算子用在預處理器期間將巨集引數轉換為字串
#的轉換作用是在預處理器完成的,因此只在巨集定義中有效
編譯器不知道#的轉換作用
用法:
#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.iint 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...