C 程..."/>
溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

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

發(fā)布時間:2020-06-20 19:32:15 來源:網絡 閱讀:453 作者:上帝之子521 欄目:編程語言

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

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

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

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

        那么面向過程的程序設計思想是怎樣的呢?面向過程是一種以過程為中心的編程思想;首先將復雜的問題分解為一個個容易解決的問題,分解過后的問題可以按照步驟一步一步的完成。函數是面向過程在 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 中分別聲明了這些,并且使用了他們進行一些運算,我們來看看編譯是否可以通過。

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

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

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

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


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

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI