您好,登錄后才能下訂單哦!
我們知道在 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 中分別聲明了這些,并且使用了他們進行一些運算,我們來看看編譯是否可以通過。
我們看到編譯產生了一個警告,但是結果是正確的。在現代的 gcc 編譯器中,已經優化了結構體的聲明,也就是說,使用外部結構體的時候,不用使用 extern 關鍵字也可以。我們去掉 test.c 中第 6 行的 extern 關鍵字,編譯也可以通過。如果我們將 global.c 中的 g_var 定義為 float,而在 test.c 中將它聲明為 int 型,我們看看會打印出什么
我們看到了打印出的值非常大,所以聲明和定義時完全不相同的。 通過對函數的學習,總結如下:1、函數是面向過程思想在 C 語言中的體現;2、面向過程是由上至下分解問題的設計方法;3、程序中的定義和聲明完全不同,C 語言中通過 extern 對程序單元進行聲明。
歡迎大家一起來學習 C 語言,可以加我QQ:243343083。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。