哦!這該死的 C 語言!

點擊藍色「程序員cxuan 」關注我喲程序員

加個「星標」,歡迎來撩web


這是程序員cxuan的第 37 期分享


前言

C 語言是一門抽象的面向過程的語言,C 語言普遍應用於底層開發,C 語言在計算機體系中佔據着不可替代的做用,能夠說 C 語言是編程的基礎,也就是說,無論你學習任何語言,都應該把 C 語言放在首先要學的位置上。下面這張圖更好的說明 C 語言的重要性面試

能夠看到,C 語言是一種底層語言,是一種系統層級的語言,操做系統就是使用 C 語言來編寫的,好比 Windows、Linux、UNIX 。若是說其餘語言是光鮮亮麗的外表,那麼 C 語言就是靈魂,永遠那麼樸實無華。shell

C 語言特性

那麼,既然 C 語言這麼重要,它有什麼值得咱們去學的地方呢?咱們不該該只由於它重要而去學,咱們更在乎的是學完咱們能學會什麼,能讓咱們得到什麼。編程

C 語言的設計

C 語言是 1972 年,由貝爾實驗室的丹尼斯·裏奇(Dennis Ritch)肯·湯普遜(Ken Thompson)在開發 UNIX 操做系統時設計了C語言。C 語言是一門流行的語言,它把計算機科學理論和工程實踐理論完美的融合在一塊兒,使用戶可以完成模塊化的編程和設計。數組

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

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");
    
    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 程序將字符逐一讀入寄存器,再把它放到內存中,以下圖所示

當咱們在鍵盤上敲擊回車鍵的時候,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) 的硬件技術實現的。最新的、處理器更強大的系統甚至有三級緩存:L一、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 的縮寫,在操做系統中表示資料源無更多的資料可讀取。資料源一般稱爲檔案或串流。一般在文本的最後存在此字符表示資料結束。

C 標準庫的 errno.h 頭文件定義了整數變量 errno,它是經過系統調用設置的,這些庫函數代表了什麼發生了錯誤。

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

limits.h 頭文件決定了各類變量類型的各類屬性。定義在該頭文件中的宏限制了各類變量類型(好比 char、int 和 long)的值。

locale.h 頭文件定義了特定地域的設置,好比日期格式和貨幣符號

math.h 頭文件定義了各類數學函數和一個宏。在這個庫中全部可用的功能都帶有一個 double 類型的參數,且都返回 double 類型的結果。

setjmp.h 頭文件定義了宏 setjmp()、函數 longjmp() 和變量類型 jmp_buf,該變量類型會繞過正常的函數調用和返回規則。

signal.h 頭文件定義了一個變量類型 sig_atomic_t、兩個函數調用和一些宏來處理程序執行期間報告的不一樣信號。

stdarg.h 頭文件定義了一個變量類型 va_list 和三個宏,這三個宏可用於在參數個數未知(即參數個數可變)時獲取函數中的參數。

stddef .h 頭文件定義了各類變量類型和宏。這些定義中的大部分也出如今其它頭文件中。

stdlib .h 頭文件定義了四個變量類型、一些宏和各類通用工具函數。

string .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 語言的編譯過程和執行過程等,在這以後咱們又加深講解了一下入門例子程序的組成特徵。

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


往期精選

我工做三年了,該懂併發了(乾貨)

個人文章是最棒的狗糧

今天懟個人面試官居然和我在同一個羣裏...

2w字 + 40張圖帶你參透併發編程!

完了,這個硬件成精了,它居然繞過了 CPU......



本文分享自微信公衆號 - 程序員cxuan(cxuangoodjob)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索