局部變量,塊內的變量(函數為最大的塊)
全局變量在所有函數之外(函數都可用)
內存:
代碼區 數據區
棧為局部變量
堆區為動態分配
全局數據區,靜態數據區
常量區,主要是字面量,內存為只讀的。
函數的形參,可以給默認值
可以為形參指定默認值(從右向左),調用時可以不用傳遞參數。
fact(int n,int m = 1);
但是不能跳躍傳遞參數,二義性!
enum Sex{
MALE,FEMALE
}
void disp(char* name, Sex gender = MALE);
函數聲明中指定了默認值,不能在定義時,再指定默認值,但可以追加默認值。
fact(int , int =1); 這樣聲明沒問題。
內聯函數,提高程序運行效率,調用函數時,不是調用,而是搬一份到調用處,不用進行真正函數調用,所以無開辟棧的開銷。
會增加代碼的長度
如果函數很復雜,不能成為內聯函數。不支持控制結果。
規定1,必須先定義,不支持函數原形。
因為搬函數代碼時,是在編譯過程中進行的。
比較 調用開銷 VS 執行開銷,來判斷是否使用內聯函數,對于很簡單的函數值得內聯。
2.是否能成為內聯函數完全有編譯程序決定
3.不支持控制結構。











































遞歸函數
一個函數自己調用自己,不管問題多復雜,只要把問題簡化為最簡單的形式。
遞歸函數不可能是內聯函數
效率,遞歸 < 循環 < 公式
任何遞歸都可以改為非遞歸,需要用到棧,代碼就很看懂了。改后,不一定提高效率。因為遞歸本身就是去開辟棧完成的。為何不保留代碼可讀性呢。
唯一條件,遞歸必須存在一個必須滿足的條件,以結束推出。
菲波那契數列,求對應位置的值
頭文件






函數定義文件,遞歸

































主函數文件















