1. 程式人生 > 實用技巧 >02、SpringBoot執行原理探究

02、SpringBoot執行原理探究

函式

函式的原型和呼叫

在使用函式前必須定義或者宣告函式

double circle(double r);
int main(){	
    double length = circle(10);
    printf("length = %f\n", length);	
    return 0;
} 
double circle(double r)
{	
    return 2 * 3.14 * r;
}

函式的形參與實參

在呼叫函式的時候,函式大多數都有引數,主調函式和被呼叫函式之間需要傳遞資料。

在定義函式時函式名後面括弧中的變數名稱為“形式引數”,簡稱形參。在呼叫函式時,函式名後面括號中的變數或表示式稱為“實際引數”,簡稱實參。

1形參在未出現函式呼叫時,他們並不佔用記憶體單元,只有在發生函式呼叫的時候形參才被分配記憶體,函式呼叫完成後,形參所佔的記憶體被釋放

2實參可以是變數,常量或者表示式

3在定義函式時,一定要指定形參的資料型別

4形參與實參的資料型別一定要可相容

5在C語言中,實參與形參的資料傳遞是“值傳遞”,即單向傳遞,只由實參傳遞給形參,而不能由形參傳遞給實參。

如果函式的引數是個陣列,那麼是可以通過形參修改實參的值的

函式的返回型別與返回值

1函式的返回值通過函式中的return獲得,如果函式的返回值為void可以不需要return語句。

2函式return語句中的返回值資料型別應該與函式定義時相同。

3如果函式中沒有return語句,那麼函式將返回一個不確定的值。

main函式與exit函式與函式的return語句

int test1(){	
    printf("111111\n"); //return 0;	exit(0);//在子函式中呼叫exit同樣代表程式終止,但在子函式中呼叫return只是子函式終止,程式正常執行
    printf("222222\n");
}
    int main(){	
        test1();	
        printf("AAAAAA\n");	
        exit(100);//exit是C語言的庫函式,呼叫exit的結果就是程式終止	
    return 100;//在main函式中呼叫exit與呼叫return是一樣的	
    printf("CCCCCCC\n"); return 0;//main函式return代表程式終止	
    printf("BBBBBB\n");
}

多個原始碼檔案程式的編譯

標頭檔案的使用

如果把main函式放在第一個檔案中,而把自定義函式放在第二個檔案中,那麼就需要在第一個檔案中宣告函式原型。

如果把函式原型包含在一個頭檔案裡,那麼就不必每次使用函式的時候都宣告其原型了。把函式宣告放入標頭檔案是很好的習慣。

#include與#define的意義

#include就是簡單的檔案內容替換

#define就是簡單的文字替換而已

#ifndef與#endif

#ifndef的意思就是條件預編譯,如果#ifndef 後面的條件成立,那麼就預編譯從#ifndef開始到#endif之間的程式碼,否則不會去預編譯這段程式碼

函式的遞迴

函式可以呼叫自己,這就叫函式的遞迴

void recurse(int i){	
    if (i > 0)	{		
        recurse(i - 1);
    }	
    printf("i = %d\n", i);
} 
int main(){	
    recurse(10);	
    return 0;
}

遞迴的過程分析

void up_down(int n){	
    printf("in %d, location %p\n", n, &n);	
    if (n < 4)		
        up_down((n + 1));
    printf("out %d, location %p\n", n, &n);
} 
int main(){	
    up_down(1);
    return 0;
}

![img](file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml9124\wps1.jpg)

![img](file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml9124\wps2.jpg)

![img](file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml9124\wps3.jpg)

有n個人排成一隊,問第n個人多少歲,他回答比前面一個人大2歲,再問前面一個人多少歲,他回答比前面一個人大2歲,一直問到最後問第一個人,他回答10歲

int age(int n)
{	
    int i;	
    if (n == 1)		
        i = 10;	
    else		
        i = age(n - 1) + 2;	
    return i;
}

將10進位制數轉化為二進位制數的例子

234在十進位制下為2 * 10的2次方 + 3 * 10的1次方 + 4*10的0次方。

奇數的二進位制最後一位一定是1,偶數的二進位制最後一位一定是0。

可以通過 number % 2 得到二進位制形式的最後一位,如果要將一個完整的整數轉化為二進位制就需要用到遞迴函式。

在遞迴呼叫之前,計算 number % 2的值,然後在遞迴呼叫語句之後進行輸出,這樣計算出的第一個數值反而在最後一個輸出。

為了得出下一個數,需要把原數除以2,這種計算相當於十進位制下把小數點左移一位,如果此時得出的數是偶數,,則下一個二進位制的數值是0,如果得出的是奇數,那麼下一個二進位制數為1。

直到被2除的結果小於2,就停止遞迴。

void to_binary(unsigned int n)
{	
    unsigned int i = n % 2;
    if (n >= 2)		
        to_binary(n / 2);	
    printf("%c", i + 0x30);
}

斐波那契數列例子

斐波那契數列指的是這樣一個數列 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, ...

第0項是0,第1項是第一個1。

這個數列從第2項開始,每一項都等於前兩項之和。

int fib(int n)
{	
    if (n == 0)		
        return 0;	
    if (n == 1)		
        return 1;	
    if (n > 1)		
        return fib(n - 1) + fib(n - 2);
}

遞迴的優點

遞迴給某些程式設計問題提供了最簡單的方法

遞迴的缺點

一個有缺陷的遞迴會很快耗盡計算機的資源,遞迴的程式難以理解和維護。