我們將所有的 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 apt install build-essential
在 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$
回傳值
這是 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
這個程式成功地執行了,但是沒有觸發第二個命令,
變數和型別
在一些語言中,你可以創建變數而不具體指定變數所包含的資料的型別,這些語言如此設計使得解釋器需要對一個變數運行一些測驗來視圖發現變數是什么樣的資料型別,例如,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 語言語法的所有要素,
作者:Linux中國
來源:掘金
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/224417.html
標籤:C
上一篇:c語言-資料型別
下一篇:C語言-常量/變數
