C語言簡單程式設計速成!保姆級入門教程, 目標達成!
能看懂嗎?
1972 年,丹尼斯·裡奇Dennis Ritchie任職于貝爾實驗室Bell Labs,在幾年前,他和他的團隊成員發明了 Unix 。
在建立了一個經久不衰的作業系統(至今仍在使用)之後,他需要一種好的方法來對這些 Unix 計算機程式設計,以便它們可用執行新的任務。
在現在看來,這很奇怪,但在當時,程式語言相對較少,Fortran、Lisp、Algol以及 B 語言都很流行,但是,對於貝爾實驗室的研究員們想要做的事情來說,它們還是遠遠不夠的。
丹尼斯·裡奇表現出一種後來被稱為程式設計師的主要特徵的特質:創造了他自己的解決方案。他稱之為 C 語言,並且在近 50 年後,它仍在廣泛的使用。
░ 為什麼你應該學習 C 語言
今天,有很多語言為程式設計師提供了比 C 語言更多的特性。最明顯的是 C++ 語言,這是一種以相當露骨的方式命名的語言,它構建在 C 語言之上,建立了一種很好的面嚮物件語言。
不過,許多其它語言的存在是有充分理由的。計算機擅長一致的重複,因此任何可預見的東西都可以構建在程式語言中,對程式設計師來說這意味著更少的工作量。
為什麼在 C++ 語言中用一行語句就可以將一個int轉換為一個long時(long x = long(n);),還要在 C 語言用兩行語句呢?
然而,C 語言在今天仍然有用。
首先,C 語言是一種相當簡約和直接的語言。除了程式設計的基礎知識之外,並沒有很高階的概念,這很大程度上是因為 C 語言實際上就是現代程式語言的基礎之一。
例如,C 語言的特性之一是陣列,但是它不提供字典(除非你自己寫一個)。當你學習 C 語言時,你會學習程式設計的基礎組成部分,它可以幫助你認識到如今的程式語言的改進及其的精心設計。
因為 C 語言是一種最小化的程式語言,你的應用程式很可能會獲得性能上的提升,這在其它許多程式語言中是看不到的。
當你考慮你的程式碼可以執行多快的時候,很容易陷入錙銖必較的境地,因此,重要的是要問清楚你是否需要為某一特定任務提供更多的速度。
與 Python 或 Java 相比,使用 C 語言,你在每行程式碼中需要糾結的地方更少。C 語言程式執行很快。這是 Linux 核心使用 C 語言編寫的一個很好的理由。
最後,C 語言很容易入門,特別是,如果你正在執行 Linux,就已經能執行 C 語言程式碼了,因為 Linux 系統包含 GNU C 庫(glibc)。
為了編寫和構建 C 語言程式,你需要做的全部工作就是安裝一個編譯器,開啟一個文字編輯器,開始編碼。
░開始學習 C 語言
如果你正在執行 Linux ,你可以使用你的軟體包管理器安裝一個 C 編譯器。
●在 Fedora 或 RHEL 上:
$ sudo dnf install gcc
●在 Debian 及其衍生系統上:
$ sudo dnf install gcc
●在 macOS 上,你可以安裝Homebrew,並使用它來安裝GCC:
$ brew install gcc
●在 Windows 上, 你可以使用MinGW安裝一套最小的包含 GCC 的 GNU 實用程式集。
●在 Linux 或 macOS 上驗證你已經安裝的 GCC:
$ gcc --version
gcc (GCC) x.y.z
Copyright (C) 20XX Free Software Foundation, Inc.
● 在 Windows 上,提供 EXE 檔案的完整路徑:
PS> C:\MinGW\bin\gcc.exe --version
gcc.exe (MinGW.org GCC Build-2) x.y.z
Copyright (C) 20XX Free Software Foundation, Inc.
░C 語法
C 語言不是一種指令碼語言。它是一種編譯型語言,這意味著它由 C 編譯器處理來產生一個二進位制可執行檔案。這不同於指令碼語言(如Bash)或混合型語言(如Python)。
在 C 語言中,你可以建立函式來執行你希望做到的任務。預設情況下,執行的是一個名為main的函式。
這裡是一個使用 C 語言寫的簡單的 “hello world” 程式:
#include <stdio.h> int main() { printf("Hello world"); return 0; }
第一行包含一個被稱為stdio.h(標準輸入和輸出)的標頭檔案,它基本上是自由使用的、非常初級的 C 語言程式碼,你可以在你自己的程式中重複使用它。
然後建立了一個由一條基本的輸出語句構成的名為main的函式。儲存這些文字到一個被稱為hello.c的檔案中,然後使用 GCC 編譯它:
$ gcc hello.c --output hello
嘗試執行你的 C 語言程式:
$ ./hello
Hello world$
1、返回值
這是 Unix 哲學的一部分,一個函式在執行後“返回”一些東西:在成功時不返回任何東西,在失敗時返回其它的一些東西(例如,一個錯誤資訊)。
這些返回的內容通常使用數字(確切地說是整數)表示:0表示沒有錯誤,任何大於0的數字都表示一些不成功的狀態。
Unix 和 Linux 被設計成在執行成功時保持沉默是很明智的。這是為了讓你在執行一系列命令時,假設沒有任何錯誤或警告會妨礙你的工作,從而可以始終為成功執行做準備。類似地,在 C 語言中的函式在設計上也預期不出現錯誤。
你可以通過一個小的修改,讓你的程式看起來是失敗的,就可以看到這一點:
include <stdio.h> int main() { printf("Hello world"); return 1; }
編譯它:
$ gcc hello.c --output failer
現在使用一個內建的 Linux 測試方式來執行它。僅在成功時,&&操作符才會執行一個命令的第二部分。例如:
$ echo "success" && echo "it worked"
success
it worked
在失敗時,||測試會執行一個命令的第二部分。
$ ls blah || echo "it did not work"
ls: cannot access 'blah': No such file or directory
it did not work
現在,嘗試你的程式,在成功時,它不返回0;而是返回1:
$ ./failer && echo "it worked"
String is: hello
這個程式成功地執行了,但是沒有觸發第二個命令。
2、變數和型別
在一些語言中,你可以建立變數而不具體指定變數所包含的資料的型別。
這些語言如此設計使得直譯器需要對一個變數執行一些測試來檢視發現變數是什麼樣的資料型別。
例如,var=1定義了一個整型數,當你建立一個表示式將var與某些東西相加時,Python 知道顯然它是一個整型數。它同樣知道當你連線hello和world時,單詞world是一個字串。
C 語言不會為你做任何這些識別和調查;你必須自己定義你的變數型別。這裡有幾種變數型別,包括整型(int),字元型(char),浮點型(float),布林型(boolean)。
你可能也注意到這裡沒有字串型別。與 Python 和 Java 和 Lua 以及其它的程式語言不同,C 語言沒有字串型別,而是將字串看作一個字元陣列。
這裡是一些簡單的程式碼,它建立了一個char陣列變數,然後使用printf將陣列變數和一段簡單的資訊列印到你的螢幕上:
#include <stdio.h> int main() { char var[6] = "hello"; printf("Your string is: %s\r\n",var); }
你可能會注意到,這個程式碼示例向一個由五個字母組成的單詞提供了六個字元的空間。
這是因為在字串的結尾有處一個隱藏的終止符,它佔用了陣列中的一個位元組。你可以通過編譯和執行程式碼來執行它:
$ gcc hello.c --output hello
$ ./hello
hello
░函式
和其它的程式語言一樣,C 函式也接受可選的引數。你可以通過定義你希望函式接受的資料型別,來將引數從一個函式傳遞到另一個函式:
#include <stdio.h> int printmsg(char a[]) { printf("String is: %s\r\n",a); } int main() { char a[6] = "hello"; printmsg(a); return 0; }
簡單地將一個函式分解為兩個函式的這種方法並不是非常有用,但是它演示了預設執行main函式以及如何在函式之間傳遞資料。
░條件語句
在真實的程式設計中,你通常希望你的程式碼根據資料做出判斷。
這是使用條件語句完成的,if語句是其中最基礎的一個語句。
為了使這個示例程式更具動態性,你可以包含string.h標頭檔案,顧名思義,它包含用於檢查字串的程式碼。
嘗試使用來自string.h檔案中的strlen函式測試傳遞給printmsg函式的字串是否大於0:
#include <stdio.h> #include <string.h> int printmsg(char a[]) { size_t len = strlen(a); if ( len > 0) { printf("String is: %s\r\n",a); } } int main() { char a[6] = "hello"; printmsg(a); return 1; }
正如在這個示例中所實現的,該條件永遠都不會是非真的,因為所提供的字串總是hello,它的長度總是大於0。
這個不夠認真的重新實現的echo命令的最後一點要做是接受來自使用者的輸入。
░命令引數
stdio.h檔案包含的程式碼在每次程式啟動時提供了兩個引數: 一個是命令中包含多少項的計數(argc),一個是包含每個項的陣列(argv)。例如, 假設你發出這個虛構的命令:
$ foo -i bar
argc是3,argv的內容是:
● argv[0] = foo
●argv[1] = -i
●argv[2] = bar
你可以修改示例 C 語言程式來以字串方式接受argv[2],而不是預設的hello嗎?
░指令式程式設計語言
C 語言是一種指令式程式設計語言。它不是面向物件的,也沒有類結構。
使用 C 語言的經驗可以教你很多關於如何處理資料,以及如何更好地管理你的程式碼執行時生成的資料。
多使用 C 語言,你最後能夠編寫出其它語言(例如 Python 和 Lua)可以使用的庫。
想要了解更多關於 C 的知識,你需要使用它。在/usr/include/中查詢有用的 C 語言標頭檔案,並且看看你可以做什麼小任務來使 C 語言對你有用。
在學習的過程中,使用來自 FreeDOS 的Jim Hall編寫的C 語言忘備錄。
它在一張雙面紙忘備錄上放置了所有的基本要素,所以在你練習時,可以立即訪問 C 語言語法的所有要素。
最後,不管你是轉行也好,初學也罷,進階也可,如果你想學程式設計~
【值得關注】我的 C/C++程式設計學習交流俱樂部!【點選進入】
問題答疑,學習交流,技術探討,還有超多程式設計資源大全,零基礎的視訊也超棒~