- 第一行代碼 C語言(視頻講解版)
- 翁惠玉
- 8371字
- 2019-09-10 14:45:38
3.1 常量與變量
編寫程序時已經確定且在程序運行過程中不會修改的值,稱為常量。編寫程序時尚未確定且在程序運行過程中可以改變的值,稱為變量。
3.1.1 變量定義
C 語言規定,每個變量在使用前必須先定義。從程序員角度來看,變量定義是說明程序中有哪些值尚未確定,這些值是什么類型的,可以對它們執行哪些操作。變量就是這些沒有確定的值的代號,從計算機的角度來看,由于程序中有某些值尚未確定,在程序運行的過程中,這些值會被確定。當這些值被確定時必須有一個地方保存它們,變量定義就是為這些變量準備好存儲空間。那么必須為每個變量準備多少空間呢?這取決于變量的類型。因此,C語言的變量定義有如下格式
類型名 變量名1,變量名2,……,變量名n;
該語句定義了n個指定類型的變量。例如
int num1,num2;
定義了兩個整型變量num1和num2,而
double area;
定義了一個實型變量area。其中,int和double就是類型名。
變量有3個重要屬性:名稱、值和類型。為了理解三者之間的關系,可以將變量想象成一個外面貼有標簽的盒子。變量的名字寫在標簽上,以區分不同的盒子。若有3個盒子(即變量),可通過名字來指定其中之一。變量的值對應于盒子內裝的東西,盒子標簽上的名稱從不改變,但盒子中的內容是可變的。一旦把新的內容放入盒子,原來的內容就不見了。變量類型表明該盒子中可存放什么類型的東西。
定義變量時的一項重要工作是為變量取一個名字。變量名,以及后面提到的常量名和函數名,統稱為標識符。標識符由一組字符組成,C語言中標識符的構成遵循以下規則。
(1)標識符必須以字母或下劃線開頭。
(2)標識符中的其他字符必須是字母、數字或下劃線,不得使用空格和其他特殊符號。
(3)標識符不可以是系統的保留字,如 int、double、for、return 等,保留字在 C 語言中有特殊用途。
(4)C 語言中,標識符是區分大小寫的,即變量名中出現的大寫和小寫字母被看作是不同的字符,因此ABC、Abc和abc是3個不同的標識符。
(5)C語言沒有規定標識符的長度,但各個編譯器都有自己的規定。
(6)標識符應使讀者易于明白其作用,做到“見名知意”,一目了然。
例3.1 指出下列哪些是C語言中合法的變量名。
(1)x
(2)formulal
(3)average_rainfall
(4)%correct
(5)short
(6)tiny
(7)total output
(8)aReasonablyLongVariableName
(9)12MonthTotal
(10)marginal-cost
(11)b4hand
(12)_stk_depth
這些符號的情況如表3-1所示。
表3-1 例3.1答案

在 C 語言中,要求所有的變量在使用前都要先定義。變量定義一方面能保證有地方保存變量值,另一方面能保證變量的正確使用。例如,C 語言中的取模運算(%)只能用于整型數,如果對非整型變量進行取模運算就是一個錯誤。有了變量定義,編譯器能檢查出這個錯誤。
變量定義可以放在函數體的開始處,或放在一個程序塊(即復合語句)的開始處。所謂的程序塊就是用花括號括起來的一組語句。
在 C 語言中,變量定義只是給變量分配相應的存儲空間。我們有時還需要在定義變量時對一些變量設置初值。C 語言允許在定義變量的同時給變量賦初值,給變量賦初值可以在變量名后用‘=’指定初值
類型名 變量名=初值;
例如
int count=0;
定義了一個整型變量count,并賦初值0,即為變量count分配內存空間,并將0存儲在這個空間中
float value=3.4;
定義了一個單精度變量value,并賦初值3.4。
可以給被定義的變量中的一部分變量賦初值。例如
int sum=0, count=0, num;
定義了3個整型變量,前兩個賦了初值,最后一個沒有賦初值。
若定義一個變量時沒有為其賦初值,然后就直接引用這個變量是很危險的,因為此時變量的值為一個隨機值。給變量賦初值是良好的程序設計風格。
3.1.2 數據類型
數據類型
C 語言處理的每一個數據都必須指明類型,一個數據類型就是編譯器事先做好的一個工具。數據類型有兩個特征:該類型的數據在內存中是如何表示的,對于這類數據允許執行哪些運算。在定義變量時,C 語言根據變量類型在內存中分配所需要的空間。在應用變量時,C 語言根據變量類型解釋內存中比特串的含義,確定所執行的運算的合法性,并按照事先設計好的程序完成相應的操作。如程序中出現了表達式3+5,編譯器首先確定3和5是C語言支持的整型數,加法是整型數合法的運算,于是編譯器就調用事先寫好的實現整數加法的程序完成運算3+5。
每種程序設計語言都有自己預先定義好的一些類型,這些類型稱為基本類型或內置類型。C 語言可以處理的基本數據類型如圖3-1所示。
1.整型
整型
整型是處理整數的工具,一個整型變量中可以存放一個整數。整型數是一個整數,但整型數和整數并不完全相同。數學中的整數可以有無窮個,但計算機中的整型數是有窮的。整型數的范圍取決于整型數占用的內存空間的大小。
整型數可以執行算術運算和比較運算,C 語言編譯器已經包含了如何實現這些運算的代碼。這些運算的含義與數學中完全相同。整型數還可以通過 scanf和printf函數輸入/輸出。
根據占用空間的長度,C 語言中將整型分為標準整型、長整型和短整型,它們都可用于處理正整數或負整數,只是占用空間大小不同,可表示的數值范圍不同。顧名思義,長整型表示范圍最大,標準整型次之,短整型最小。在有些應用中,整數的范圍通常都是正整數(如年齡、考試分數和一些計數器)。為了充分利用變量的空間,可以將這些變量定義為“無符號”的,即不考慮負數,把所有的整數都看成是正整數。這樣就不需要存儲整數的符號,將所有位都用于存儲數據。C語言一共有6種整型類型。

圖3-1 基本數據類型
C 語言沒有規定各類整型數所占的內存字節數,每種類型的數值占多少字節是由編譯器決定的。在VS2010中各類型所占的字節數和表示范圍如表3-2所示。
表3-2 標準的整型類型

類型名中的方括號內的部分是可以省略的。例如,short int與short是等價的。要定義一個短整型數shortnum,可用
short int shortnum;
或
short shortnum;
要定義一個計數器,可用
unsigned int counter;
或
unsigned counter;
因為計數器的值一定是一個正整數。要定義一個普通的整型變量num,可用
int num;
編程時,遇到一個值未確定的整數時可以定義一個整型變量。根據可能的數值范圍選擇short、int、long或unsigned。
2.實型
實型
實型是處理實數的工具,一個實型變量中可以存放一個實數。實型數是一個實數,但實型數和實數并不完全相同。數學中實數的大小是無限制的,但計算機中的實型數大小和精度都是有限制的。實型數大小和精度取決于實型數占用的內存空間的大小。
實型數可以執行算術運算和比較運算,這些運算的含義與數學中完全相同。實型數還可以直接通過scanf和printf函數輸入/輸出。
根據占用空間的長度,C 語言將實型數分為單精度(float)和雙精度(double)。顧名思義,雙精度比單精度表示范圍大且精度高。與整型類似,C 語言并沒有規定實型數應該用多少位表示,這些都是由編譯器決定的。在VS2010中,float類型占4個字節,double類型占8個字節。float類型可保證十進制 7 到 8 位的精度,表示范圍是 10-38到 1038。double 類型的精度是十進制的 15 到16位,表示范圍是10-308到10308。
要定義兩個單精度的實型變量x、y,可用
float x, y;
要定義一個雙精度的實型變量z,可用
double z;
由于實型數是用有限的存儲單元組成的,所以能提供的有效數字的位數是有限的。如果一個實數的位數超過有效數字的范圍,有效位以外的數字將被舍去,這樣就會產生一些誤差。例如,將123.456789存放在float類型的變量x中,那么x中的值為123.456787,因為float只能保證7位的精度。而如果 x是 double型的變量,則它的值為123.456789,因為 double型可保證15到16位的精度。計算機不能精確表示實型數。
3.字符型
字符型
計算機除了能處理數字之外,還能處理文本信息,所有文本信息的基礎是字符。字符型是處理字符的工具。
字符在機器內部用一個編號表示。可以把所有可處理的字符寫在一個表中,然后對它們順序編號。例如,可以用整數1代表字母 A,整數2代表字母B,依次類推,在用26表示字母 Z 后,可以繼續用整數27、28、29等來表示小寫字母、數字、標點符號和其他字符。
盡管每一臺計算機可以自己規定每個字符的編碼,但這樣做會出現一些問題。當今,信息通常在不同的計算機之間共享:你可以用 U 盤將程序從一臺計算機復制到另一臺計算機,也可以讓你的計算機直接與國內或國際網上的其他計算機通信。為了使這種通信成為可能,計算機必須能夠以某種公共的語言“互相交談”,而這種公共語言最基本的要求是各類計算機有同樣的字符編碼,以免一臺機器上的字母A在另一臺機器上變成字母Z。
在早期,不同的計算機確實用不同的字符編碼。字母 A 在一臺計算機上有一種特定的表示,但在由另一個生產廠商生產的計算機上卻有完全不同的表示,甚至可用字符集也會不同。例如,一臺計算機鍵盤上可能有字符¢,而另一臺計算機則完全不能表示這個字符。
然而,隨著時間的推移,許多計算機生產廠商認識到計算機之間相互通信會帶來許多好處,于是開始采用統一的字符編碼標準。最常用的字符編碼標準是 ASCII(American Standard Code for Information Interchange)字符編碼系統。ASCII編碼用8位二進制數表示一個字符。即每個字符對應一個0~255之間的整數。本書假設所用的計算機系統采用的是ASCII編碼,ASCII表請見附錄十三。
在大多數情況下,雖然知道字符在內部用什么編碼標準是很重要的,但是知道哪個數值對應于哪一特定字符并不是很有用。這個編碼對計算機用戶是透明的。當在鍵盤輸入字母 A 時,鍵盤中的硬件自動將此字符翻譯成它的 ASCII 值,即65,然后把它發送給計算機。同樣,當計算機把ASCII值65發送給顯示器時,屏幕上會出現字母A。這些工作并不需要用戶程序的介入。
盡管不需要記住每個字符的具體編碼,但 ASCII 編碼的以下兩個結構特性是值得牢記的,它們在編程中有很重要的用途。事實上,幾乎所有的編碼都符合這兩個結構特性。
? 表示數字0~9的字符的編碼是連續的。盡管不需要知道哪個編碼對應于數字字符'0',但要知道數字'1'的編碼是比'0'的編碼大1的整數。同樣,如果'0'的編碼加9,就是字符'9'的編碼。
? 字母按字母序分成兩段:一段是大寫字母(A~Z),一段是小寫字母(a~z)。在每一段中,ASCII值是連續的。
在 C 語言中,單個字符是用數據類型 char 來表示的。按非正規的說法,數據類型 char 的值域是一組能在屏幕上顯示或能在鍵盤上輸入的符號。這些符號(包括字母、數字、標點符號、空格、回車鍵等)是所有文本數據的基本構件。要定義字符類型的變量ch,可用以下語句
char ch;
變量ch在內存中占一個字節的空間,該字節中存放的是對應字符的ASCII值。
字符型的變量可以執行算術運算和比較運算,也可以調用scanf和printf函數輸入/輸出。
由于字符在內部用 ASCII 碼表示,即一個整型數,因此字符能像整數一樣參與計算,不需要特別的轉換,結果是按其 ASCII值計算的。例如,字符'A',它在內部是用 ASCII值65表示的,在運算時被當作整數65處理。
盡管對 char 類型的值應用任何算術運算都是合法的,但在它的值域內,不是所有運算都是有意義的。例如,在程序中將'A'乘以'B'是合法的,為了得到結果,計算機取它們的內部編碼,即65和66,將它們相乘,得到4290。而這個整數作為字符毫無意義,事實上,它超出了 ASCII 字符的范圍。當對字符進行運算時,僅有少量的算術運算是有意義的。下面列舉了幾種有意義的運算。
? 對一個字符加上一個整數。如果 c 是一個字符,n 是一個整數,表達式 c+n 表示編碼序列中 c 后面的第 n 個字符。例如,如果 n 在0~9之間,表達式'0'+n 得到的是第 n 個數字的字符編碼,如'0'+5是字符'5'的編碼。同樣,如果 n 在1~26之間,'A'+n?1表示字母表中第 n 個大寫字母的字符編碼。'A'+1是字母B的編碼,'A'+2是字母C的編碼。
? 從一個字符中減去一個整數。表達式 c?n 表示編碼序列中 c 前面的第 n 個字符。例如,表達式'Z'?2的結果是字符'X'的編碼。
? 從一個字符中減去另一個字符。如果c1和c2都是字符,那么表達式c1? c2表示兩個字符在編碼序列中的距離。例如,'g'-'f'的值為1。
比較兩個字符的值是常用的運算。比較字符是比較它們的 ASCII 值,經常用來確定字母的次序。例如,如果在ASCII表中c1在c2前面,表達式c1< c2的值為"真"。
由于字符型變量中存儲的是字符的內碼,是一個整數,所以早期的 C 語言程序員經常把字符型當作整型來用以節省內存空間。如果看成有符號數,則用 char 定義。如果看成無符號數,則用unsigned char 定義。但現在的計算機系統已不在乎多用幾個字節,所以不要用 char 類型的變量保存整型數,以免影響程序的可讀性。
4.類型或變量占用的空間量
在 C 語言中,每種類型的變量在內存中占用的內存量隨編譯器的不同而有所不同。占用的空間量決定了變量的取值范圍。需要知道某種類型的變量占用多少字節,可以使用 sizeof運算符。例如,需要了解 int 型的變量占用了多少字節,可用 sizeof(int);需要了解 float 類型的變量占用多少空間,可以用 sizeof(float)。sizeof 還可用于表達式。例如,需要知道表達式'a'+15的結果值占多少空間,可以用 sizeof('a'+ 15); 需要知道變量 x占用多少空間,可用 sizeof(x)。代碼清單3-1輸出了各種類型占用的內存字節數。
代碼清單3-1 了解各種類型的數值占用的內存量
/ * 文件名: 3-1.c
了解各種類型數據的內存占用量 */
#include <stdio.h>
int main()
{
printf("%d %d %d\n", sizeof(long double), sizeof(double), sizeof(float));
printf("%d %d %d\n", sizeof(long int), sizeof(int), sizeof(short));
printf("%d\n", sizeof(char));
return 0;
}
在VS2010中執行這個程序,得到的輸出結果為
8 8 4
4 4 2
1
3.1.3 常量與符號常量
常量通常分為整型常量、實型常量、字符常量、字符串常量和符號常量。
1.整型常量
整型常量有3種表示方法:十進制、十六進制和八進制。
十進制數與平時采用的十進制表示是一樣的,如123、756、-18等,系統按照數值的大小自動將其表示成int或long int。在int表示范圍內的整數常量被作為int類型,超出int類型的整數常量被作為 long 類型。如果需要計算機把一個整數強制看成是長整型時,可以在這個整數后面加一個"l"或"L",如100L 表示把這個100看成是長整型。在 VS2010中,int 和 long 類型占用的字節數是相同的,所以所有的整型常量都被看成是int類型。
八進制數的每一位可以是0到7之間的一個數值,所以很難判斷一個數是八進制還是十進制。如123既是一個合法的十進制數也是一個合法的八進制數。為了區分一個數到底是八進制還是十進制,C 語言規定八進制常量必須以0開頭。在數學中,0123通常就被寫為123。但在 C 語言中, 0123和123是不同的,0123表示八進制數123,它對應的十進制值為
1×82+2×81+3×80=83
十六進制的每一位的值是0~9和 A~F 之間的一個值,A 代表十進制的10,B 代表十進制的11,……,F 代表十進制的15。如果一個十六進制數中沒有字母,則很難判斷這個數是十進制還是十六進制,如123既是一個合法的十進制數也是一個合法的十六進制數。為了區分一個數到底是十六進制還是十進制,C 語言規定十六進制數必須以0x 開頭。如0x123表示十六進制的123,它對應的十進制值為
1×162+2×161+3×160=291
例3.2 下列哪些常量為 C 語言中合法的整型常量:①42;②1,000,000;③-17;④ 123456789;⑤20;⑥23L;⑦5.6;⑧1A23;⑨018。
這些值的情況如表3-3所示。
表3-3 例3.2答案

2.實型常量
實型常量有兩種表示方法:十進制小數形式和科學計數法。十進制小數與日常表示相同,由數字和小數點組成,如:123.4,0.0,0.123。科學計數法把實型常量用"尾數×10指數"的方式表示,但程序設計語言中不能表示上標。因此,用了一種替代的方法:“尾數 e 指數”,或“尾數 E 指數”,如123×103可寫成123e3或123E3。
注意
字母 e 或 E 之前必須有數字,而 e 后面必須是整數,不能有小數。例如,e3、1e3.3、e等都是非法的科學計數法表示。即使實型數是10的冪,如105,也不能表示成e5,而要表示成1e5。因為表示成e5就產生了二義性,編譯器無法確定它是一個實型數還是一個變量名。
C 語言程序中的實型常量都被作為 double 型處理。如果要將一個實型常量作為 float 類型的數據,可在數值后面加上字母F。例如,1.23f或1.2e3F。
例3.3 下列哪些常量為 C 語言中合法實型常量:①-2.3;②1,000,000;③0.000001;④1.1E+11;⑤3.1415926;⑥1.1X+11;⑦5.6;⑧2.4e-2;⑨2.2E2.2。
這些值的情況如表3-4所示。
表3-4 例3.3答案

3.字符常量
C 語言的字符常量是用單引號括起來的一個字符。例如,'a'、'D'、'1'、'?'等都是字符常量,這些字符被稱為可打印字符,因為它們都出現在鍵盤上,也可以顯示在顯示器上或用打印機打印出來。例如,在定義了變量ch后,可用
ch='A';
將字符'A'存放在變量 ch 中。此時 ch 對應的這個字節中存儲了十進制值65,這是大寫字母 A 的ASCII值。
由于字符類型變量對應的內存中存放的是字符的編碼,C 語言允許直接將編碼賦給字符類型的變量。如要將'A'賦給變量ch,可以直接用ch=65。
盡管 C 語言允許將一個字符的內碼賦給一個字符型的變量,但盡量不要這樣使用,這將會影響程序的可移植性。如果你的計算機采用ASCII編碼,則程序中的ch='A'和ch=65是等價的。但如果要將此程序移植到另外一臺計算機上運行,則ch=65可能導致不正確的執行結果。因為程序的本意是將字符'A'存于變量ch,而在這臺計算機上65不一定是字符“A”的內碼。
ASCII 編碼的長度為8個比特,可以編碼256個字符。但可打印字符通常只有100個左右。多余的編碼通常被計算機用作控制字符,代表某一動作。例如,讓光標移到下一行的行首。這些字符無法通過鍵盤輸入,因此也被稱為“非打印字符”。為了輸入和表示這些字符,C 語言采用了一個稱為轉義序列(escape sequence)的方式,用一系列可打印的字符來表示一個非打印字符。每個轉義序列以字符“\”開頭。字符“\”被稱為轉義字符。表3-5列出了一些預定義的轉義序列。
表3-5 常用特殊字符的轉義序列

在編譯時,每個序列被轉換為一個 ASCII 編碼。這些特殊字符的編碼可見 ASCII 表。例如,換行符的 ASCII 編碼為10。雖然每個轉義序列由幾個字符組成,但它表示的是一個字符,可以括在一對單引號中,也可以存放在一個字符類型的變量中。如ch是字符類型的變量
ch='\n';
它是合法的。執行了這個語句后,變量 ch 中保存的是換行符的內碼。如果計算機采用 ASCII 編碼,ch保存的值是10。
轉義序列也可以直接用printf函數輸出,如
printf( "\n");
將顯示器上的光標移到下一行的第一列。
當編譯器看見反斜杠字符時,會認為是轉義序列開始了。如果要表示反斜杠本身,必須在一對單引號中用兩個連續的反斜杠,如'\\'。同樣,當單引號被用作字符常量時,必須在前面加上一個反斜杠"\"。轉義序列也可以出現在字符串常量中。例如
printf( "hello, world\n hello, everyone\n");
輸出兩行
hello, world
hello, everyone
ASCII 表中的許多特殊字符沒有明確的轉義序列,在程序中可以直接使用它們的內部編碼。在使用時,可用轉義字符'\'后接該字符內碼的八進制表示。例如,字符常量'\177'表示ASCII值為八進制數177對應的字符,這個字符對應于 Delete 鍵的編碼。在數值上,八進制值177對應于十進制整數127(即1×64+7×8+7=127)。
實際上,ASCII 編碼系統中的許多特殊字符在編程時很少使用。對大多數程序設計應用而言,只需要知道換行('\n')、tab('\t')等有限的幾個就夠了。
例3.4 以下哪些是合法的字符常量:'a',"ab",'ab','\n','0123','\0123',"m"
合法的字符常量必須是用單引號括起來的一個字符,所以"ab"和"m"是錯的,因為它們是用雙引號括起來的。合法的字符常量只能是一個字符,所以'ab'和'0123'是錯的。'\n'和'\0123'雖然也有多個字符,但它們是一個轉義序列。'\n'表示的是換行字符,'\0123'表示的是編碼的八進制值為123的字符,所以也是正確的。正確的字符常量有'a'、'\n'、和'\0123'。
4.字符串常量
由一系列字符組成的序列稱為字符串。如
printf( "hello, world\nhello, everyone\n");
中的"hello, world\nhello, everyone\n"就是一個字符串常量。C 語言的字符串常量是用一對雙引號括起來的。C語言沒有專門的字符串類型,如何保存字符串變量將在第7章討論。
由于雙引號是作為字符串開始和結束標記的,因此,當雙引號作為字符串的一部分時,必須寫成轉義序列。例如,語句
printf("\"Bother,\" said Pooh.\n");
中的第二、三個雙引號是字符串的一部分,不是字符串開始或結束標記。該語句的輸出為
"Bother," said Pooh.
注意
請注意區分字符常量和字符串常量。字符常量用單引號引起來,單引號內只能放一個字符。字符串常量是用雙引號引起來的,雙引號內可以放一串字符。特別要注意轉義序列,盡管由多個字符組成,但它表示的是一個字符,所以也是用單引號引起來的。字符常量可以存放在一個字符類型的變量中,但字符類型的變量不能存放字符串。
5.符號常量
符號常量
對于程序中一些有特殊意義的常量,可以給它們取一個有意義的名字,便于讀程序的程序員知道該常量的意義。有名字的常量稱為符號常量,定義符號常量采用編譯預處理指令#define。定義的格式為
#define 符號常量名 字符串
如在程序中要為π取一個名字,可用以下定義
#define PI 3.14159
一旦定義了符號常量,就可以在程序中使用它。例如程序中需要計算圓的面積,則可用表達式
S=PI * r * r;
C 語言定義的符號常量也稱為“宏”。C 語言的預編譯器執行 define 指令時用指令中的“字符串”替換程序中所有的符號常量名。例如,對于上述定義,經過預編譯后程序中的
S=PI * r * r;
被轉換成
S=3.14159 * r * r;
由于預編譯器處理 define 指令時采用簡單的替換,因此可能出現一些與程序員預期不符的結果,使用時必須注意。例如
程序中有語句
area=PI * RADIUS * RADIUS;
程序員期望的是計算一個半徑為8的圓的面積,即結果是201.06。但很遺憾,結果是30.25。為什么會這樣?因為C語言對“宏”的處理只是簡單的替換。對上述語句,經過替換后的結果是
area=3.14159 *3+5 * 3+5;
符號常量名的命名規范與變量相同,但通常變量名是用小寫字母或大小寫字母組成,而符號常量名通常全用大寫字母。
把有意義的常量定義成符號常量是一種良好的程序設計習慣。畢竟對我們而言,有意義的符號比抽象的數字更容易理解。例如,看到 PI 比3.1416更容易聯想到 π。另外,定義符號常量也有利于將來程序的修改,如有一個專門處理圓的程序,其中一定會有多處用到 π,如果編程時 π 的值是用3.14,但后來發現3位精度太低,希望用3.1415926。如果 π 的值在程序中出現10次,就需要修改10個地方。但如果把 π 定義成一個符號常量 PI,程序中的 π 值都用符號常量 PI 代替,則修改時只需要修改一個地方,即符號常量定義處。
- 極簡算法史:從數學到機器的故事
- Effective C#:改善C#代碼的50個有效方法(原書第3版)
- Mastering Concurrency in Go
- Java應用開發與實踐
- 基于免疫進化的算法及應用研究
- Learning Apache Kafka(Second Edition)
- Rust Essentials(Second Edition)
- 自然語言處理Python進階
- Yii Project Blueprints
- 深度探索Go語言:對象模型與runtime的原理特性及應用
- Python語言科研繪圖與學術圖表繪制從入門到精通
- 零基礎學C語言(升級版)
- 數據科學中的實用統計學(第2版)
- 程序員面試金典(第6版)
- JavaScript Mobile Application Development