C之函數的意義(三十八)

        我們知道在 C 語言中,程序是由一個個的函數組成的。那麼我們來看看函數的由來,程序 = 數據 + 算法 ==> C 程序 = 數據 + 函數;衆所周知,C 語言是面向過程的一種編程語言,那麼它就是採用的是模塊化程序設計的思想。下面這張圖更加形象的表示了 C 語言的特性

圖片.png

        我們再來看看 C 語言中的模塊化

圖片.png

        那麼面向過程的程序設計思想是怎樣的呢?面向過程是一種以過程爲中心的編程思想;首先將複雜的問題分解爲一個個容易解決的問題,分解過後的問題可以按照步驟一步一步的完成。函數是面向過程在 C 語言中的體現,解決問題的每個步驟可以用函數來實現。

        下來我們來看看一個有意思的問題,聲明和定義一樣嗎?我們經常將函數聲明和函數定義搞混,聲明的意義在於告訴編譯器程序單元的存在,定義則明確指示程序單元的意義。C 語言中通過 extern 進行重新單元的聲明,一些程序單元在聲明時可以省略 extern,嚴格意義上來說,聲明和定義並不相同!

        我們通過下面這份示例代碼進行聲明和定義的分析


        test.c 源碼

#include <stdio.h>
#include <malloc.h>

extern int g_var;

extern struct Test;

int main()
{
    extern void f(int i, int j);
    extern int g(int x);
    
    struct Test* p = NULL; // (struct Test*)malloc(sizeof(struct Test));
    
    printf("p = %p\n", p);
    
    printf("g_var = %d\n", g_var);
    
    f(1, 2);
    
    printf("g(3) = %d\n", g(3));
    
    free(p);
    
    return 0;
}



        global.c 源碼

#include <stdio.h>

int g_var = 10;

struct Test
{
    int x;
    int y;
};

void f(int i, int j)
{
    printf("i + j = %d\n", i + j);
}

int g(int x)
{
    return (int)(2 * x + g_var);
}

        我們在 global.c 中定義了 g_var 變量,結構體 Test 和 函數 f() 及 g()。在 test.c 中分別聲明瞭這些,並且使用了他們進行一些運算,我們來看看編譯是否可以通過。

圖片.png

        我們看到編譯產生了一個警告,但是結果是正確的。在現代的 gcc 編譯器中,已經優化了結構體的聲明,也就是說,使用外部結構體的時候,不用使用 extern 關鍵字也可以。我們去掉 test.c 中第 6 行的 extern 關鍵字,編譯也可以通過。如果我們將 global.c 中的 g_var 定義爲 float,而在 test.c 中將它聲明爲 int 型,我們看看會打印出什麼

圖片.png

        我們看到了打印出的值非常大,所以聲明和定義時完全不相同的。 通過對函數的學習,總結如下:1、函數是面向過程思想在 C 語言中的體現;2、面向過程是由上至下分解問題的設計方法;3、程序中的定義和聲明完全不同,C 語言中通過 extern 對程序單元進行聲明。


        歡迎大家一起來學習 C 語言,可以加我QQ:243343083

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章