開始學習C,一種基礎的程式語言
C可能是最廣為人知的程式語言。它被全球各地的電腦科學課程作為參考語言,可能和Python和Java一起是人們在學校學得最多的語言。
我記得它是我學到的第二種程式語言,之後是Pascal。
C不僅僅是學生用來學習程式設計的語言,它不是一門學術語言。而且我會說它並不是最容易的語言,因為C是一種相對較低階的程式語言。
今天,在嵌入式設備中廣泛使用C,它也為大多數使用Linux的網絡服務器提供動力。Linux內核使用C編寫,這也意味著C動力了所有Android設備的核心。我們可以說C代碼運行了整個世界的很大一部分。真是令人驚訝。
在C誕生之時,它被認為是一種高階語言,因為它在各種機器上都可移植。今天我們基本上認為,可以在Mac上運行在Windows或Linux上的程序,也許可以使用Node.js或Python。但在過去,根本不是這種情況。C所帶來的是一種易於實現的語言,具有可以輕易移植到不同機器的編譯器。
我提到了編譯器:C是一種編譯語言,就像Go、Java、Swift或Rust一樣。其他流行的編程語言如Python、Ruby或JavaScript則是解釋語言。差異是顯著的:編譯語言會生成一個可以直接執行和分發的二進製文件。
C不會進行垃圾回收。這意味著我們必須自己管理內存。這是一個複雜的任務,需要非常小心地防止bug,但這也是C成為編寫Arduino等嵌入式設備程序的理想語言。
C不隱藏底層機器的複雜性和功能。一旦你知道你可以做什麼,你就擁有了很大的能力。
現在,我想介紹第一個C程序,我們將它稱為“Hello, World!”
#include <stdio.h>
int main(void) {
printf("Hello, World!");
}
讓我們來描述一下程式原始碼:首先我們引入了stdio
庫(這個名稱代表標準輸入輸出庫)。
這個庫讓我們可以使用輸入/輸出函數。
C本身非常小,除了核心部分,其他任何東西都是由庫提供的。這些庫有些是由普通程序員編寫的,並提供給其他人使用。還有一些庫是編譯器內建的,像stdio
和其他庫一樣。
stdio
是提供printf()
函數的庫。
這個函數被包裝在main()
函數中。main()
函數是任何C程序的入口點。
那麼,什麼是函數?
函數是一個例程,它接受一個或多個參數並返回一個單一值。
在main()
的情況下,該函數不接受任何參數,並返回一個整數。在參數中使用void
關鍵字來識別,並使用int
關鍵字來聲明返回值。
函數有一個函數體,它用大括號括起來,在函數體內我們放置了函數執行所需的所有代碼。
printf()
函數的寫法不同,正如你所見。它沒有定義返回值,我們傳入一個用雙引號括起來的字符串。我們沒有指定參數的類型。
這是因為這是一個函數調用。在stdio
庫的某個地方,printf
被定義為
int printf(const char *format, ...);
你現在不需要理解這意味著什麼,但簡而言之,這就是函數的定義,當我們調用printf("Hello, World!");
時,函數就執行了。
上面我們定義的main()
函數:
#include <stdio.h>
int main(void) {
printf("Hello, World!");
}
在執行程序時,將由操作系統來執行。
那麼,如何執行C程序?
如前所述,C是一種編譯語言。要運行程序,我們必須首先編譯它。任何Linux或macOS電腦都已內建了C編譯器。對於Windows,您可以使用Windows Subsystem for Linux(WSL)。
無論如何,當您打開終端窗口時,可以輸入gcc
,這個命令應該會返回一個錯誤,說您沒有指定任何文件:
這很好。這意味著C編譯器存在,我們可以開始使用它。
現在輸入上面的程序到一個hello.c
文件中。您可以使用任何編輯器,但出於簡單起見,我將使用終端中的nano
編輯器:
輸入程序:
現在按下ctrl-X
退出:
按下y
鍵確認,然後按回車鍵確認文件名:
這樣,我們應該回到終端:
現在輸入
gcc hello.c -o hello
該程序不應該產生任何錯誤:
但它應該生成一個hello
可執行文件。現在輸入
./hello
來運行它:
我在程序名前面加了
./
以告訴終端該指令位於當前文件夾
太棒了!
現在,如果你執行ls -al hello
,你可以看到這個程序只有12KB大小:
這是C的一個優點之一:它高度優化,這也是它成為非常適合資源非常有限的嵌入式設備的原因之一。
詳細了解C的其他教程: