教你C 語言簡單編程速成

咱們將全部的 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:ui

$ 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中國來源:掘金

相關文章
相關標籤/搜索