Linux中國

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:MinGWbingcc.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 &apos;blah&apos;: No such file or directory
it did not work

現在,嘗試你的程序,在成功時,它返回 0;而是返回 1

$ ./failer && echo "it worked"
String is: hello

這個程序成功地執行了,但是沒有觸發第二個命令。

變數和類型

在一些語言中,你可以創建變數而不具體指定變數所包含的數據的類型。這些語言如此設計使得解釋器需要對一個變數運行一些測試來視圖發現變數是什麼樣的數據類型。例如,var=1 定義了一個整型數,當你創建一個表達式將 var 與某些東西相加時,Python 知道顯然它是一個整型數。它同樣知道當你連接 helloworld 時,單詞 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: %srn",var);
}

你可能會注意到,這個代碼示例向一個由五個字母組成的單詞提供了六個字元的空間。這是因為在字元串的結尾有處一個隱藏的終止符,它佔用了數組中的一個位元組。你可以通過編譯和執行代碼來運行它:

$ gcc hello.c --output hello
$ ./hello
hello

函數

和其它的編程語言一樣,C 函數也接受可選的參數。你可以通過定義你希望函數接受的數據類型,來將參數從一個函數傳遞到另一個函數:

#include <stdio.h>

int printmsg(char a[]) {
   printf("String is: %srn",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: %srn",a);
  }
}

int main() {
   char a[6] = "hello";
   printmsg(a);
   return 1;
}

正如在這個示例中所實現的,該條件永遠都不會是非真的,因為所提供的字元串總是 hello,它的長度總是大於 0。這個不夠認真的重新實現的 echo 命令的最後一點要做是接受來自用戶的輸入。

命令參數

stdio.h 文件包含的代碼在每次程序啟動時提供了兩個參數: 一個是命令中包含多少項的計數(argc),一個是包含每個項的數組(argv)。例如, 假設你發出這個虛構的命令:

$ foo -i bar

argc3argv 的內容是:

  • 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 語言語法的所有要素。

via: https://opensource.com/article/20/8/c-programming-cheat-sheet

作者:Seth Kenlon 選題:lujun9972 譯者:robsean 校對:wxy

本文由 LCTT 原創編譯,Linux中國 榮譽推出


本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive

對這篇文章感覺如何?

太棒了
0
不錯
0
愛死了
0
不太好
0
感覺很糟
0
雨落清風。心向陽

    You may also like

    Leave a reply

    您的電子郵箱地址不會被公開。 必填項已用 * 標註

    此站點使用Akismet來減少垃圾評論。了解我們如何處理您的評論數據

    More in:Linux中國