哦!這該死的 C 語言

程式設計師cxuan發表於2020-09-10

前言

C 語言是一門抽象的程式導向的語言,C 語言廣泛應用於底層開發,C 語言在計算機體系中佔據著不可替代的作用,可以說 C 語言是程式設計的基礎,也就是說,不管你學習任何語言,都應該把 C 語言放在首先要學的位置上。下面這張圖更好的說明 C 語言的重要性

可以看到,C 語言是一種底層語言,是一種系統層級的語言,作業系統就是使用 C 語言來編寫的,比如 Windows、Linux、UNIX 。如果說其他語言是光鮮亮麗的外表,那麼 C 語言就是靈魂,永遠那麼樸實無華。

C 語言特性

那麼,既然 C 語言這麼重要,它有什麼值得我們去學的地方呢?我們不應該只因為它重要而去學,我們更在意的是學完我們能學會什麼,能讓我們獲得什麼。

C 語言的設計

C 語言是 1972 年,由貝爾實驗室的丹尼斯·裡奇(Dennis Ritch)肯·湯普遜(Ken Thompson)在開發 UNIX 作業系統時設計了C語言。C 語言是一門流行的語言,它把電腦科學理論和工程實踐理論完美的融合在一起,使使用者能夠完成模組化的程式設計和設計。

電腦科學理論:簡稱 CS、是系統性研究資訊與計算的理論基礎以及它們在計算機系統中如何實現與應用的實用技術的學科。

C 語言具有高效性

C 語言是一門高效性語言,它被設計用來充分發揮計算機的優勢,因此 C 語言程式執行速度很快,C 語言能夠合理了使用記憶體來獲得最大的執行速度

C 語言具有可移植性

C 語言是一門具有可移植性的語言,這就意味著,對於在一臺計算機上編寫的 C 語言程式可以在另一臺計算機上輕鬆地執行,從而極大的減少了程式移植的工作量。

C 語言特點

  • C 語言是一門簡潔的語言,因為 C 語言設計更加靠近底層,因此不需要眾多 Java 、C# 等高階語言才有的特性,程式的編寫要求不是很嚴格。
  • C 語言具有結構化控制語句,C 語言是一門結構化的語言,它提供的控制語句具有結構化特徵,如 for 迴圈、if⋯ else 判斷語句和 switch 語句等。
  • C 語言具有豐富的資料型別,不僅包含有傳統的字元型、整型、浮點型、陣列型別等資料型別,還具有其他程式語言所不具備的資料型別,比如指標。
  • C 語言能夠直接對記憶體地址進行讀寫,因此可以實現組合語言的主要功能,並可直接操作硬體。
  • C 語言速度快,生成的目的碼執行效率高。

下面讓我們通過一個簡單的示例來說明一下 C 語言

入門級 C 語言程式

下面我們來看一個很簡單的 C 語言程式,我是 mac 電腦,所以我使用的是 xcode 進行開發,我覺得工具無所謂大家用著順手就行。

第一個 C 語言程式

#include <stdio.h>

int main(int argc, const char * argv[]) {
    printf("Hello, World!\n");
  
    printf("my Name is cxuan \n")
    
    printf("number = %d \n", number);
    
    return 0;
}

你可能不知道這段程式碼是什麼意思,不過彆著急,我們先執行一下看看結果。

這段程式輸出了 Hello,World!My Name is cxuan,最後一行是程式的執行結果,表示這段程式是否有錯誤。下面我們解釋一下各行程式碼的含義。

首先,第一行的 #include <stdio.h>, 這行程式碼包含另一個檔案,這一行告訴編譯器把 stdio.h 的內容包含在當前程式中。 stdio.h 是 C 編譯器軟體包的標準部分,它能夠提供鍵盤輸入和顯示器輸出。

什麼是 C 標準軟體包?C 是由 Dennis M 在1972年開發的通用,過程性,命令式計算機程式語言。C標準庫是一組 C 語言內建函式,常量和標頭檔案,例如<stdio.h>,<stdlib.h>,<math.h>等。此庫將用作 C 程式設計師的參考手冊。

我們後面會介紹 stdio.h ,現在你知道它是什麼就好。

在 stdio.h 下面一行程式碼就是 main 函式。

C 程式能夠包含一個或多個函式,函式是 C 語言的根本,就和方法是 Java 的基本構成一樣。main() 表示一個函式名,int 表示的是 main 函式返回一個整數。void 表明 main() 不帶任何引數。這些我們後面也會詳細說明,只需要記住 int 和 void 是標準 ANSI C 定義 main() 的一部分(如果使用 ANSI C 之前的編譯器,請忽略 void)。

然後是 /*一個簡單的 C 語言程式*/ 表示的是註釋,註釋使用 /**/ 來表示,註釋的內容在兩個符號之間。這些符號能夠提高程式的可讀性。

注意:註釋只是為了幫助程式設計師理解程式碼的含義,編譯器會忽略註釋

下面就是 { ,這是左花括號,它表示的是函式體的開始,而最後的右花括號 } 表示函式體的結束。 { } 中間是書寫程式碼的地方,也叫做程式碼塊。

int number 表示的是將會使用一個名為 number 的變數,而且 number 是 int 整數型別。

number = 11 表示的是把值 11 賦值給 number 的變數。

printf(Hello,world!\n); 表示呼叫一個函式,這個語句使用 printf() 函式,在螢幕上顯示 Hello,world , printf() 函式是 C 標準庫函式中的一種,它能夠把程式執行的結果輸出到顯示器上。而程式碼 \n 表示的是 換行,也就是另起一行,把游標移到下一行。

然後接下來的一行 printf() 和上面一行是一樣的,我們就不多說了。最後一行 printf() 有點意思,你會發現有一個 %d 的語法,它的意思表示的是使用整形輸出字串。

程式碼塊的最後一行是 return 0,它可以看成是 main 函式的結束,最後一行是程式碼塊 } ,它表示的是程式的結束。

好了,我們現在寫完了第一個 C 語言程式,有沒有對 C 有了更深的認識呢?肯定沒有。。。這才哪到哪,繼續學習吧。

現在,我們可以歸納為 C 語言程式的幾個組成要素,如下圖所示

C 語言執行流程

C 語言程式成為高階語言的原因是它能夠讀取並理解人們的思想。然而,為了能夠在系統中執行 hello.c 程式,則各個 C 語句必須由其他程式轉換為一系列低階機器語言指令。這些指令被打包作為可執行物件程式,儲存在二進位制磁碟檔案中。目標程式也稱為可執行目標檔案。

在 UNIX 系統中,從原始檔到物件檔案的轉換是由編譯器執行完成的。

gcc -o hello hello.c

gcc 編譯器驅動從原始檔讀取 hello.c ,並把它翻譯成一個可執行檔案 hello。這個翻譯過程可用如下圖來表示

這就是一個完整的 hello world 程式執行過程,會涉及幾個核心元件:前處理器、編譯器、彙編器、聯結器,下面我們逐個擊破。

  • 預處理階段(Preprocessing phase),前處理器會根據開始的 # 字元,修改源 C 程式。#include <stdio.h> 命令就會告訴前處理器去讀系統標頭檔案 stdio.h 中的內容,並把它插入到程式作為文字。然後就得到了另外一個 C 程式hello.i,這個程式通常是以 .i為結尾。

  • 然後是 編譯階段(Compilation phase),編譯器會把文字檔案 hello.i 翻譯成文字hello.s,它包括一段組合語言程式(assembly-language program)

  • 編譯完成之後是彙編階段(Assembly phase),這一步,彙編器 as會把 hello.s 翻譯成機器指令,把這些指令打包成可重定位的二進位制程式(relocatable object program)放在 hello.c 檔案中。它包含的 17 個位元組是函式 main 的指令編碼,如果我們在文字編輯器中開啟 hello.o 將會看到一堆亂碼。

  • 最後一個是連結階段(Linking phase),我們的 hello 程式會呼叫 printf 函式,它是 C 編譯器提供的 C 標準庫中的一部分。printf 函式位於一個叫做 printf.o檔案中,它是一個單獨的預編譯好的目標檔案,而這個檔案必須要和我們的 hello.o 進行連結,聯結器(ld) 會處理這個合併操作。結果是,hello 檔案,它是一個可執行的目標檔案(或稱為可執行檔案),已準備好載入到記憶體中並由系統執行。

你需要理解編譯系統做了什麼

對於上面這種簡單的 hello 程式來說,我們可以依賴編譯系統(compilation system)來提供一個正確和有效的機器程式碼。然而,對於我們上面講的程式設計師來說,編譯器有幾大特徵你需要知道

  • 優化程式效能(Optimizing program performance),現代編譯器是一種高效的用來生成良好程式碼的工具。對於程式設計師來說,你無需為了編寫高質量的程式碼而去理解編譯器內部做了什麼工作。然而,為了編寫出高效的 C 語言程式,我們需要了解一些基本的機器碼以及編譯器將不同的 C 語句轉化為機器程式碼的過程。
  • 理解連結時出現的錯誤(Understanding link-time errors),在我們的經驗中,一些非常複雜的錯誤大多是由連結階段引起的,特別是當你想要構建大型軟體專案時。
  • 避免安全漏洞(Avoiding security holes),近些年來,緩衝區溢位(buffer overflow vulnerabilities)是造成網路和 Internet 服務的罪魁禍首,所以我們有必要去規避這種問題。

系統硬體組成

為了理解 hello 程式在執行時發生了什麼,我們需要首先對系統的硬體有一個認識。下面這是一張 Intel 系統產品的模型,我們來對其進行解釋

  • 匯流排(Buses):在整個系統中執行的是稱為匯流排的電氣管道的集合,這些匯流排在元件之間來回傳輸位元組資訊。通常匯流排被設計成傳送定長的位元組塊,也就是 字(word)。字中的位元組數(字長)是一個基本的系統引數,各個系統中都不盡相同。現在大部分的字都是 4 個位元組(32 位)或者 8 個位元組(64 位)。

  • I/O 裝置(I/O Devices):Input/Output 裝置是系統和外部世界的連線。上圖中有四類 I/O 裝置:用於使用者輸入的鍵盤和滑鼠,用於使用者輸出的顯示器,一個磁碟驅動用來長時間的儲存資料和程式。剛開始的時候,可執行程式就儲存在磁碟上。

    每個I/O 裝置連線 I/O 匯流排都被稱為控制器(controller) 或者是 介面卡(Adapter)。控制器和介面卡之間的主要區別在於封裝方式。控制器是 I/O 裝置本身或者系統的主印製板電路(通常稱作主機板)上的晶片組。而介面卡則是一塊插在主機板插槽上的卡。無論組織形式如何,它們的最終目的都是彼此交換資訊。

  • 主存(Main Memory),主存是一個臨時儲存裝置,而不是永久性儲存,磁碟是 永久性儲存 的裝置。主存既儲存程式,又儲存處理器執行流程所處理的資料。從物理組成上說,主存是由一系列 DRAM(dynamic random access memory) 動態隨機儲存構成的集合。邏輯上說,記憶體就是一個線性的位元組陣列,有它唯一的地址編號,從 0 開始。一般來說,組成程式的每條機器指令都由不同數量的位元組構成,C 程式變數相對應的資料項的大小根據型別進行變化。比如,在 Linux 的 x86-64 機器上,short 型別的資料需要 2 個位元組,int 和 float 需要 4 個位元組,而 long 和 double 需要 8 個位元組。

  • 處理器(Processor)CPU(central processing unit) 或者簡單的處理器,是解釋(並執行)儲存在主儲存器中的指令的引擎。處理器的核心大小為一個字的儲存裝置(或暫存器),稱為程式計數器(PC)。在任何時刻,PC 都指向主存中的某條機器語言指令(即含有該條指令的地址)。

    從系統通電開始,直到系統斷電,處理器一直在不斷地執行程式計數器指向的指令,再更新程式計數器,使其指向下一條指令。處理器根據其指令集體系結構定義的指令模型進行操作。在這個模型中,指令按照嚴格的順序執行,執行一條指令涉及執行一系列的步驟。處理器從程式計數器指向的記憶體中讀取指令,解釋指令中的位,執行該指令指示的一些簡單操作,然後更新程式計數器以指向下一條指令。指令與指令之間可能連續,可能不連續(比如 jmp 指令就不會順序讀取)

    下面是 CPU 可能執行簡單操作的幾個步驟

  • 載入(Load):從主存中拷貝一個位元組或者一個字到記憶體中,覆蓋暫存器先前的內容

  • 儲存(Store):將暫存器中的位元組或字複製到主儲存器中的某個位置,從而覆蓋該位置的先前內容

  • 操作(Operate):把兩個暫存器的內容複製到 ALU(Arithmetic logic unit) 。把兩個字進行算術運算,並把結果儲存在暫存器中,重寫暫存器先前的內容。

算術邏輯單元(ALU)是對數字二進位制數執行算術和按位運算的組合數位電子電路。

  • 跳轉(jump):從指令中抽取一個字,把這個字複製到程式計數器(PC) 中,覆蓋原來的值

剖析 hello 程式的執行過程

前面我們簡單的介紹了一下計算機的硬體的組成和操作,現在我們正式介紹執行示例程式時發生了什麼,我們會從巨集觀的角度進行描述,不會涉及到所有的技術細節

剛開始時,shell 程式執行它的指令,等待使用者鍵入一個命令。當我們在鍵盤上輸入了 ./hello 這幾個字元時,shell 程式將字元逐一讀入暫存器,再把它放到記憶體中,如下圖所示

當我們在鍵盤上敲擊Enter鍵的時候,shell 程式就知道我們已經結束了命令的輸入。然後 shell 執行一系列指令來載入可執行的 hello 檔案,這些指令將目標檔案中的程式碼和資料從磁碟複製到主存。

利用 DMA(Direct Memory Access) 技術可以直接將磁碟中的資料複製到記憶體中,如下

一旦目標檔案中 hello 中的程式碼和資料被載入到主存,處理器就開始執行 hello 程式的 main 程式中的機器語言指令。這些指令將 hello,world\n 字串中的位元組從主存複製到暫存器檔案,再從暫存器中複製到顯示裝置,最終顯示在螢幕上。如下所示

快取記憶體是關鍵

上面我們介紹完了一個 hello 程式的執行過程,系統花費了大量時間把資訊從一個地方搬運到另外一個地方。hello 程式的機器指令最初儲存在磁碟上。當程式載入後,它們會拷貝到主存中。當 CPU 開始執行時,指令又從記憶體複製到 CPU 中。同樣的,字串資料 hello,world \n 最初也是在磁碟上,它被複制到記憶體中,然後再到顯示器裝置輸出。從程式設計師的角度來看,這種複製大部分是開銷,這減慢了程式的工作效率。因此,對於系統設計來說,最主要的一個工作是讓程式執行的越來越快。

由於物理定律,較大的儲存裝置要比較小的儲存裝置慢。而由於暫存器和記憶體的處理效率在越來越大,所以針對這種差異,系統設計者採用了更小更快的儲存裝置,稱為快取記憶體儲存器(cache memory, 簡稱為 cache 快取記憶體),作為暫時的集結區域,存放近期可能會需要的資訊。如下圖所示

圖中我們標出了快取記憶體的位置,位於快取記憶體中的 L1快取記憶體容量可以達到數萬位元組,訪問速度幾乎和訪問暫存器檔案一樣快。容量更大的 L2 快取記憶體通過一條特殊的匯流排連結 CPU,雖然 L2 快取比 L1 快取慢 5 倍,但是仍比記憶體要哦快 5 - 10 倍。L1 和 L2 是使用一種靜態隨機訪問儲存器(SRAM) 的硬體技術實現的。最新的、處理器更強大的系統甚至有三級快取:L1、L2 和 L3。系統可以獲得一個很大的儲存器,同時訪問速度也更快,原因是利用了快取記憶體的 區域性性原理。

Again:入門程式細節

現在,我們來探討一下入門級程式的細節,由淺入深的來了解一下 C 語言的特性。

#include<stdio.h>

我們上面說到,#include<stdio.h> 是程式編譯之前要處理的內容,稱為編譯預處理命令。

預處理命令是在編譯之前進行處理。預處理程式一般以 # 號開頭。

所有的 C 編譯器軟體包都提供 stdio.h 檔案。該檔案包含了給編譯器使用的輸入和輸出函式,比如 println() 資訊。該檔名的含義是標準輸入/輸出 標頭檔案。通常,在 C 程式頂部的資訊集合被稱為 標頭檔案(header)

C 的第一個標準是由 ANSI 釋出的。雖然這份文件後來被國際標準化組織(ISO)採納並且 ISO 釋出的修訂版也被 ANSI 採納了,但名稱 ANSI C(而不是 ISO C) 仍被廣泛使用。一些軟體開發者使用ISO C,還有一些使用 Standard C

C 標準庫

除了 <sdtio.h> 外,C 標準庫還包括下面這些標頭檔案

<assert.h>

提供了一個名為 assert 的關鍵字,它用於驗證程式作出的假設,並在假設為假輸出診斷訊息。

<ctype.h>

C 標準庫的 ctype.h 標頭檔案提供了一些函式,可以用於測試和對映字元。

這些字元接受 int 作為引數,它的值必須是 EOF 或者是一個無符號字元

EOF是一個計算機術語,為 End Of File 的縮寫,在作業系統中表示資料源無更多的資料可讀取。資料源通常稱為檔案或串流。通常在文字的最後存在此字元表示資料結束。

<errno.h>

C 標準庫的 errno.h 標頭檔案定義了整數變數 errno,它是通過系統呼叫設定的,這些庫函式表明了什麼發生了錯誤。

<float.h>

C 標準庫的 float.h 標頭檔案包含了一組與浮點值相關的依賴於平臺的常量。

<limits.h>

limits.h 標頭檔案決定了各種變數型別的各種屬性。定義在該標頭檔案中的巨集限制了各種變數型別(比如 char、int 和 long)的值。

<locale.h>

locale.h 標頭檔案定義了特定地域的設定,比如日期格式和貨幣符號

<math.h>

math.h 標頭檔案定義了各種數學函式和一個巨集。在這個庫中所有可用的功能都帶有一個 double 型別的引數,且都返回 double 型別的結果。

<setjmp.h>

setjmp.h 標頭檔案定義了巨集 setjmp()、函式 longjmp() 和變數型別 jmp_buf,該變數型別會繞過正常的函式呼叫和返回規則。

<signal.h>

signal.h 標頭檔案定義了一個變數型別 sig_atomic_t、兩個函式呼叫和一些巨集來處理程式執行期間報告的不同訊號。

<stdarg.h>

stdarg.h 標頭檔案定義了一個變數型別 va_list 和三個巨集,這三個巨集可用於在引數個數未知(即引數個數可變)時獲取函式中的引數。

<stddef.h>

stddef .h 標頭檔案定義了各種變數型別和巨集。這些定義中的大部分也出現在其它標頭檔案中。

<stdlib.h>

stdlib .h 標頭檔案定義了四個變數型別、一些巨集和各種通用工具函式。

<string.h>

string .h 標頭檔案定義了一個變數型別、一個巨集和各種操作字元陣列的函式。

<time.h>

time.h 標頭檔案定義了四個變數型別、兩個巨集和各種操作日期和時間的函式。

main() 函式

main 函式聽起來像是調皮搗蛋的孩子故意給方法名起一個 主要的 方法,來告訴他人他才是這個世界的中心。但事實卻不是這樣,而 main() 方法確實是世界的中心。

C 語言程式一定從 main() 函式開始執行,除了 main() 函式外,你可以隨意命名其他函式。通常,main 後面的 () 中表示一些傳入資訊,我們上面的那個例子中沒有傳遞資訊,因為圓括號中的輸入是 void 。

除了上面那種寫法外,還有兩種 main 方法的表示方式,一種是 void main(){} ,一種是 int main(int argc, char* argv[]) {}

  • void main() 宣告瞭一個帶有不確定引數的構造方法
  • int main(int argc, char* argv[]) {} 其中的 argc 是一個非負值,表示從執行程式的環境傳遞到程式的引數數量。它是指向 argc + 1 指標陣列的第一個元素的指標,其中最後一個為null,而前一個(如果有的話)指向表示從主機環境傳遞給程式的引數的字串。 如果argv [0]不是空指標(或者等效地,如果argc> 0),則指向表示程式名稱的字串,如果在主機環境中無法使用程式名稱,則該字串為空。

註釋

在程式中,使用 /**/ 的表示註釋,註釋對於程式來說沒有什麼實際用處,但是對程式設計師來說卻非常有用,它能夠幫助我們理解程式,也能夠讓他人看懂你寫的程式,我們在開發工作中,都非常反感不寫註釋的人,由此可見註釋非常重要。

C 語言註釋的好處是,它可以放在任意地方,甚至程式碼在同一行也沒關係。較長的註釋可以多行表示,我們使用 /**/ 表示多行註釋,而 // 只表示的是單行註釋。下面是幾種註釋的表示形式

// 這是一個單行註釋

/* 多行註釋用一行表示 */

/*
 	多行註釋用多行表示
 	 	多行註釋用多行表示
 	 	 	多行註釋用多行表示
 	 	 	 	多行註釋用多行表示

*/

函式體

在標頭檔案、main 方法後面的就是函式體(註釋一般不算),函式體就是函式的執行體,是你編寫大量程式碼的地方。

變數宣告

在我們入門級的程式碼中,我們宣告瞭一個名為 number 的變數,它的型別是 int,這行程式碼叫做 宣告,宣告是 C 語言最重要的特性之一。這個宣告完成了兩件事情:定義了一個名為 number 的變數,定義 number 的具體型別。

int 是 C 語言的一個 關鍵字(keyword),表示一種基本的 C 語言資料型別。關鍵字是用於語言定義的。不能使用關鍵字作為變數進行定義。

示例中的 number 是一個 識別符號(identifier),也就是一個變數、函式或者其他實體的名稱。

變數賦值

在入門例子程式中,我們宣告瞭一個 number 變數,併為其賦值為 11,賦值是 C 語言的基本操作之一。這行程式碼的意思就是把值 1 賦給變數 number。在執行 int number 時,編譯器會在計算機記憶體中為變數 number 預留空間,然後在執行這行賦值表示式語句時,把值儲存在之前預留的位置。可以給 number 賦不同的值,這就是 number 之所以被稱為 變數(variable) 的原因。

printf 函式

在入門例子程式中,有三行 printf(),這是 C 語言的標準函式。圓括號中的內容是從 main 函式傳遞給 printf 函式的。引數分為兩種:實際引數(actual argument)形式引數(formal parameters)。我們上面提到的 printf 函式括號中的內容,都是實參。

return 語句

在入門例子程式中,return 語句是最後一條語句。int main(void) 中的 int 表明 main() 函式應返回一個整數。有返回值的 C 函式要有 return 語句,沒有返回值的程式也建議大家保留 return 關鍵字,這是一種好的習慣或者說統一的編碼風格。

分號

在 C 語言中,每一行的結尾都要用 ; 進行結束,它表示一個語句的結束,如果忘記或者會略分號會被編譯器提示錯誤。

關鍵字

下面是 C 語言中的關鍵字,C 語言的關鍵字一共有 32 個,根據其作用不同進行劃分

資料型別關鍵字

資料型別的關鍵字主要有 12 個,分別是

  • char: 宣告字元型變數或函式
  • double: 宣告雙精度變數或函式
  • float: 宣告浮點型變數或函式
  • int : 宣告整型變數或函式
  • long: 宣告長整型變數或函式
  • short : 宣告短整型變數或函式
  • signed : 宣告有符號型別變數或函式
  • _Bool: 宣告布林型別
  • _Complex :宣告覆數
  • _Imaginary: 宣告虛數
  • unsigned : 宣告無符號型別變數或函式
  • void : 宣告函式無返回值或無引數,宣告無型別指標

控制語句關鍵字

控制語句迴圈的關鍵字也有 12 個,分別是

迴圈語句

  • for : for 迴圈,使用的最多
  • do :迴圈語句的前提條件迴圈體
  • while:迴圈語句的迴圈條件
  • break : 跳出當前迴圈
  • continue:結束當前迴圈,開始下一輪迴圈

條件語句

  • if:條件語句的判斷條件
  • else : 條件語句的否定分支,與 if 連用
  • goto: 無條件跳轉語句

開關語句

  • switch: 用於開關語句
  • case:開關語句的另外一種分支
  • default : 開關語句中的其他分支

返回語句

retur :子程式返回語句(可以帶引數,也看不帶引數)

儲存型別關鍵字

  • auto : 宣告自動變數 一般不使用
  • extern : 宣告變數是在其他檔案正宣告(也可以看做是引用變數)
  • register : 宣告暫存器變數
  • static: 宣告靜態變數

其他關鍵字

  • const: 宣告只讀變數
  • sizeof : 計算資料型別長度
  • typedef: 用以給資料型別取別名
  • volatile : 說明變數在程式執行中可被隱含地改變

後記

這篇文章我們先介紹了 C 語言的特性,C 語言為什麼這麼火,C 語言的重要性,之後我們以一道 C 語言的入門程式講起,我們講了 C 語言的基本構成要素,C 語言在硬體上是如何執行的,C 語言的編譯過程和執行過程等,在這之後我們又加深講解了一下入門例子程式的組成特徵。

如果你覺得這篇文章不錯的的話,歡迎小夥伴們四連走起:點贊、在看、留言、分享。你的四連是我更文的動力。

你好,我是 cxuan,我自己手寫了四本 PDF,分別是 Java基礎總結、HTTP 核心總結、計算機基礎知識,作業系統核心總結,我已經整理成為 PDF,可以關注公眾號 Java建設者 回覆 PDF 領取優質資料。

我自己寫了四本 PDF ,非常硬核,連結如下

我自己寫了四本 PDF ,非常硬核,連結如下

cxuan 嘔心瀝血肝了四本 PDF。

相關文章