(1)define的用法
(1)#define定義巨集常量可以出現在**的任何地方
(2)從#define巨集定義位置開始,以後的**就都可以使用這個巨集了
(3)編譯器會在預處理的時候用真身替換巨集
(2)定義函式
#define sum(a, b) ((a)+(b))
(3)撤銷定義
#undef sum
(4)內建巨集
line:表示正在編譯的檔案的行號
file:表示正在編譯的檔案的名字
date:表示編譯時刻的日期字串
time:表示編譯時刻的時間字串
function:表示編譯時候所在的函式
1、ifdef條件編譯有3種方式
(1)#ifdef…#else…#endif
#ifdef 識別符號
程式段1
#else
程式段2
#endif
它的功能是:如果識別符號已被#define命令定義過,則對程式段1進行編譯;否則對程式段2進行編譯。如果沒有程式段2(它為空),本格式種的#else可以沒有,既可以寫為:
#ifdef 識別符號
程式段#endif
(2)#ifdef…#else…#endif
#ifndef 識別符號
程式段1
#else
程式段2
#endif
(3)#if…#else…#endif
#if 常量表示式
程式段1
#else
程式段2
#endif
它的功能是:如果常量表示式的值為真(非0),則對程式段1進行編譯;否則對程式段2進行編譯。因此可以使程式在不同條件下編譯,完成不同的功能。
1、功能
#用於在與編譯期間將巨集引數轉化為字串
##用於在預編譯期間粘連兩個符號
1、功能:
使用關鍵字 typedef 可以為型別起乙個新的別名
2、給普通型別起名字
typedef int integer;
注意要加 ;
3、給數值型別起名字
typedef char array20[20];
4、給結構體型別起名字2種形式
(1)typedef struct stu
stu;
(2)struct stu
;typedef struct stu stu
5、給函式指標型別起名字
typedef int(*pfunc)(int a,int b)
6、與define的區別
typedef 在表現上有時候類似於 #define,但它和巨集替換之間存在乙個關鍵性的區別。正確思考這個問題的方法就是把 typedef 看成一種徹底的「封裝」型別,宣告之後不能再往裡面增加別的東西。
(1) 可以使用其他型別說明符對巨集型別名進行擴充套件,但對 typedef 所定義的型別名卻不能這樣做。如下所示:
#define interge int
unsigned interge n; //沒問題
typedef int interge;
unsigned interge n; //錯誤,不能在 interge 前面新增 unsigned
(2) 在連續定義幾個變數的時候,typedef 能夠保證定義的所有變數均為同一型別,而 #define 則無法保證。例如:
#define ptr_int int *
ptr_int p1, p2;
經過巨集替換以後,第二行變為:
int *p1, p2;
這使得 p1、p2 成為不同的型別:p1 是指向 int 型別的指標,p2 是 int 型別。
相反,在下面的**中:
typedef int * ptr_int
ptr_int p1, p2;
p1、p2 型別相同,它們都是指向 int 型別的指標。
用來終止乙個函式並返回其後面跟著的值
1、用於修飾變數(靜態變數)
變數又分兩種型別
(1)區域性變數:修飾區域性變數的時候,可以增加區域性變數的壽命。加上staric就是靜態變數了,存放在資料區,不在是棧。當出棧後這個變數的值還是存在著,直到程式結束才釋放掉
(2)全域性變數:修飾全域性變數的時候,可以令這個全域性變數只能在本檔案中使用,其他檔案就算加上extern也無法使用(就是隱藏了起來)。
2、用於修飾函式(靜態函式)
令函式只能在本檔案中使用,好處在不同的人編寫函式時,不用怕名字重複。
2、修飾陣列
定義或說明乙個唯讀陣列可採用如下格式:
int const a[5] = ; 或 const int a[5] =
3、修飾指標
const int * p; // p可變,p指向的物件不可變
int const * p; // p可變,p指向的物件不可變
int * const p; // p不可變,p指向的物件可變
const int * const p; // 指標p和p指向的物件都不可變
這裡給出乙個記憶和理解的方法:
先忽略型別名(編譯器解析的時候也是忽略型別名),我們看const離哪個近,「近水樓台先得月」,離誰近就修飾誰。
const (int) p //const 修飾p,p是指標,p是指標指向的物件,不可變。
(int) const * p; //const 修飾p,p是指標,p是指標指向的物件,不可變。
( int) * const p;//const 修飾p,p不可變,p指向的物件可變,即p可變
const ( int)* const p; // 前乙個const修飾*p,後乙個const修飾p,指標p和p指向的物件都不可變
4、修飾陣列
const修飾也可以修飾函式的引數,當不希望這個引數值在函式體內被意外改變時使用。格式如下:
void fun(const int *p)
5、修飾返回值
const也可以用於修飾函式的返回值,返回的數值不能改變,格式如下:
const int fun(int *p)
1、 變數宣告
變數宣告就是給變數乙個名字,讓下面的程式知道有這個變數去其他檔案中找。
注意的是變數宣告只有名字,沒有空間。
2、extren:用於變數的宣告,當你使用多個檔案時想要用其他檔案中定義的變數就要用extern進行變數的宣告
第二十一天
好久沒有寫點東西了。或許是為了忙個經濟師中級的考試,列印了很多的資料,每章一節一節地在消化,咀嚼著生硬的專業術語,那滋味,只有體會過了才知道。乙個晚上看下來,做夢也是這些內容,有點累,但是,為了目標,只有克服,努力前進。單位的專案要啟動了,事情特別多,給我們準備的時間就乙個禮拜,一開始拿到這個內容需...
第二十一天總結
今天學習了c 中的函式,感覺好難看懂,跟數學含糊一樣難,函式是一組一起執行乙個任務的語句。每個 c 程式都至少有乙個函式,即主函式 main 所有簡單的程式都可以定義其他額外 的函式。您可以把 劃分到不同的函式中。如何劃分 到不同的函式中是由您來決定的,但在邏輯上,劃分通常是根據每個函式執行乙個特定...
第二十一天 PYTHON學習
今日學習 一 什麼是序列化?我們把物件 變數 從記憶體中變成可儲存或傳輸的過程稱之為序列化,在python中叫pickling,在其他語言中也被稱之為serialization,marshalling,flattening等等,都是乙個意思。二 為什麼要序列化?1 持久儲存狀態 硬碟存 需知乙個軟體...