tft每日頭條

 > 科技

 > c語言提供的數據類型有哪些

c語言提供的數據類型有哪些

科技 更新时间:2024-05-10 22:25:15

本節将詳細介紹C語言的基本數據類型,包括如何聲明變量、如何表示字面值常量(如,5或2.78),以及典型的用法。一些老式的C語言編譯器無法支持這裡提到的所有類型,請查閱你使用的編譯器文檔,了解可以使用哪些類型。

3.4.1 int類型

C語言提供了許多整數類型,為什麼一種類型不夠用?因為C語言讓程序員針對不同情況選擇不同的類型。特别是,C語言中的整數類型可表示不同的取值範圍和正負值。一般情況使用int類型即可,但是為滿足特定任務和機器的要求,還可以選擇其他類型。

int類型是有符号整型,即int類型的值必須是整數,可以是正整數、負整數或零。其取值範圍依計算機系統而異。一般而言,儲存一個int要占用一個機器字長。因此,早期的16位IBM PC兼容機使用16位來儲存一個int值,其取值範圍(即int值的取值範圍)是-32768~32767。目前的個人計算機一般是32位,因此用32位儲存一個int值。現在,個人計算機産業正逐步向着64位處理器發展,自然能儲存更大的整數。ISO C規定int的取值範圍最小為-32768~32767。一般而言,系統用一個特殊位的值表示有符号整數的正負号。第15章将介紹常用的方法。

1.聲明int變量

第2章中已經用int聲明過基本整型變量。先寫上int,然後寫變量名,最後加上一個分号。要聲明多個變量,可以單獨聲明每個變量,也可在int後面列出多個變量名,變量名之間用逗号分隔。下面都是有效的聲明:

int erns; int hogs, cows, goats;

可以分别在4條聲明中聲明各變量,也可以在一條聲明中聲明4個變量。兩種方法的效果相同,都為4個int大小的變量賦予名稱并分配内存空間。

以上聲明創建了變量,但是并沒有給它們提供值。變量如何獲得值?前面介紹過在程序中獲取值的兩種途徑。第1種途徑是賦值:

cows = 112;

第2種途徑是,通過函數(如,scanf())獲得值。接下來,我們着重介紹第3種途徑。

2.初始化變量

初始化(initialize)變量就是為變量賦一個初始值。在C語言中,初始化可以直接在聲明中完成。隻需在變量名後面加上賦值運算符(=)和待賦給變量的值即可。如下所示:

int hogs = 21; int cows = 32, goats = 14; int dogs, cats = 94; /* 有效,但是這種格式很糟糕 */

以上示例的最後一行,隻初始化了cats,并未初始化dogs。這種寫法很容易讓人誤認為dogs也被初始化為94,所以最好不要把初始化的變量和未初始化的變量放在同一條聲明中。

簡而言之,聲明為變量創建和标記存儲空間,并為其指定初始值(如圖3.4所示)。

c語言提供的數據類型有哪些(C語言基本數據類型有哪些)1

圖3.4 定義并初始化變量

3.int類型常量

上面示例中出現的整數(21、32、14和94)都是整型常量或整型字面量。C語言把不含小數點和指數的數作為整數。因此,22和-44都是整型常量,但是22.0和2.2E1則不是。C語言把大多數整型常量視為int類型,但是非常大的整數除外。詳見後面“long常量和long long常量”小節對long int類型的讨論。

4.打印int值

可以使用printf()函數打印int類型的值。第2章中介紹過,%d指明了在一行中打印整數的位置。%d稱為轉換說明,它指定了printf()應使用什麼格式來顯示一個值。格式化字符串中的每個%d都與待打印變量列表中相應的int值匹配。這個值可以是int類型的變量、int類型的常量或其他任何值為int類型的表達式。作為程序員,要确保轉換說明的數量與待打印值的數量相同,編譯器不會捕獲這類型的錯誤。程序清單3.2演示了一個簡單的程序,程序中初始化了一個變量,并打印該變量的值、一個常量值和一個簡單表達式的值。另外,程序還演示了如果粗心犯錯會導緻什麼結果。

程序清單3.2 print1.c程序

/* print1.c - 演示printf()的一些特性 */ #include <stdio.h> int main(void) { int ten = 10; int two = 2; printf("Doing it right: "); printf("%d minus %d is %d\n", ten, 2, ten - two); printf("Doing it wrong: "); printf("%d minus %d is %d\n", ten); // 遺漏2個參數 return 0; }

編譯并運行該程序,輸出如下:

Doing it right: 10 minus 2 is 8 Doing it wrong: 10 minus 16 is 1650287143

在第一行輸出中,第1個%d對應int類型變量ten;第2個%d對應int類型常量2;第3個%d對應int類型表達式ten - two的值。在第二行輸出中,第1個%d對應ten的值,但是由于沒有給後兩個%d提供任何值,所以打印出的值是内存中的任意值(讀者在運行該程序時顯示的這兩個數值會與輸出示例中的數值不同,因為内存中儲存的數據不同,而且編譯器管理内存的位置也不同)。

你可能會抱怨編譯器為何不能捕獲這種明顯的錯誤,但實際上問題出在printf()不尋常的設計。大部分函數都需要指定數目的參數,編譯器會檢查參數的數目是否正确。但是,printf()函數的參數數目不定,可以有1個、2個、3個或更多,編譯器也愛莫能助。記住,使用printf()函數時,要确保轉換說明的數量與待打印值的數量相等。

5.八進制和十六進制

通常,C語言都假定整型常量是十進制數。然而,許多程序員很喜歡使用八進制和十六進制數。因為8和16都是2的幂,而10卻不是。顯然,八進制和十六進制記數系統在表達與計算機相關的值時很方便。例如,十進制數65536經常出現在16位機中,用十六進制表示正好是10000。另外,十六進制數的每一位的數恰好由4位二進制數表示。例如,十六進制數3的二進制數是0011,十六進制數5是的二進制數0101。因此,十六進制數35的位組合(bit pattern)是00110101,十六進制數53的位組合是01010011。這種對應關系使得十六進制和二進制的轉換非常方便。但是,計算機如何知道10000是十進制、十六進制還是二進制?在C語言中,用特定的前綴表示使用哪種進制。0x或0X前綴表示十六進制值,所以十進制數16表示成十六進制是0x10或0X10。與此類似,0前綴表示八進制。例如,十進制數16表示成八進制是020。第15章将更全面地介紹進制相關的内容。

要清楚,使用不同的進制數是為了方便,不會影響數被儲存的方式。也就是說,無論把數字寫成16、020或0x10,儲存該數的方式都相同,因為計算機内部都以二進制進行編碼。

6.顯示八進制和十六進制

在C程序中,既可以使用也可以顯示不同進制的數。不同的進制要使用不同的轉換說明。以十進制顯示數字,使用%d;以八進制顯示數字,使用%o;以十六進制顯示數字,使用%x。另外,要顯示各進制數的前綴0、0x和0X,必須分别使用%#o、%#x、%#X。程序清單3.3演示了一個小程序(回憶一下,在某些集成開發環境(IDE)下編寫的代碼中插入getchar();語句,程序在執行完畢後不會立即關閉執行窗口)。

程序清單3.3 bases.c程序

/* bases.c--以十進制、八進制、十六進制打印十進制數100 */ #include <stdio.h> int main(void) { int x = 100; printf("dec = %d; octal = %o; hex = %x\n", x, x, x); printf("dec = %d; octal = %#o; hex = %#x\n", x, x, x); return 0; }

編譯并運行該程序,輸出如下:

dec = 100; octal = 144; hex = 64 dec = 100; octal = 0144; hex = 0x64

該程序以3種不同記數系統顯示同一個值。printf()函數做了相應的轉換。注意,如果要在八進制和十六進制值前顯示0和0x前綴,要分别在轉換說明中加入#。

3.4.2 其他整數類型

初學C語言時,int類型應該能滿足大多數程序的整數類型需求。盡管如此,還應了解一下整型的其他形式。當然,也可以略過本節跳至3.4.3節閱讀char類型的相關内容,以後有需要時再閱讀本節。

C語言提供3個附屬關鍵字修飾基本整數類型:short、long和unsigned。應記住以下幾點。

  • short int類型(或者簡寫為short)占用的存儲空間可能比int類型少,常用于較小數值的場合以節省空間。與int類似,short是有符号類型。
  • long int或long占用的存儲空間可能比int多,适用于較大數值的場合。與int類似,long是有符号類型。
  • long long int或long long(C99标準加入)占用的儲存空間可能比long多,适用于更大數值的場合。該類型至少占64位。與int類似,long long是有符号類型。
  • unsigned int或unsigned隻用于非負值的場合。這種類型與有符号類型表示的範圍不同。例如,16位unsigned int允許的取值範圍是0~65535,而不是-32768~32767。用于表示正負号的位現在用于表示另一個二進制位,所以無符号整型可以表示更大的數。
  • 在C90标準中,添加了unsigned long int或unsigned long和unsigned short int或unsigned short類型。C99标準又添加了unsigned long long int或unsigned long long。
  • 在任何有符号類型前面添加關鍵字signed,可強調使用有符号類型的意圖。例如,short、short int、signed short、signed short int都表示同一種類型。
1.聲明其他整數類型

其他整數類型的聲明方式與int類型相同,下面列出了一些例子。不是所有的C編譯器都能識别最後3條聲明,最後一個例子所有的類型是C99标準新增的。

long int estine; long johns; short int erns; short ribs; unsigned int s_count; unsigned players; unsigned long headcount; unsigned short yesvotes; long long ago;

2.使用多種整數類型的原因

為什麼說short類型“可能”比int類型占用的空間少,long類型“可能”比int類型占用的空間多?因為C語言隻規定了short占用的存儲空間不能多于int,long占用的存儲空間不能少于int。這樣規定是為了适應不同的機器。例如,過去的一台運行Windows 3.x的機器上,int類型和short類型都占16位,long類型占32位。後來,Windows和蘋果系統都使用16位儲存short類型,32位儲存int類型和long類型(使用32位可以表示的整數數值超過20億)。現在,計算機普遍使用64位處理器,為了儲存64位的整數,才引入了long long類型。

現在,個人計算機上最常見的設置是,long long占64位,long占32位,short占16位,int占16位或32位(依計算機的自然字長而定)。原則上,這4種類型代表4種不同的大小,但是在實際使用中,有些類型之間通常有重疊。

C标準對基本數據類型隻規定了允許的最小大小。對于16位機,short和int的最小取值範圍是[−32767,32767];對于32位機,long的最小取值範圍是[−2147483647,2147483647]。對于unsigned short和unsigned int,最小取值範圍是[0,65535];對于unsigned long,最小取值範圍是[0,4294967295]。long long類型是為了支持64位的需求,最小取值範圍是[−9223372036854775807,9223372036854775807];unsigned long long的最小取值範圍是[0,18446744073709551615]。如果要開支票,這個數是一千八百億億六千七百四十四萬億零七百三十七億零九百五十五萬一千六百一十五。但是,誰會去數?

int類型那麼多,應該如何選擇?首先,考慮unsigned類型。這種類型的數常用于計數,因為計數不用負數。而且,unsigned類型可以表示更大的正數。

如果一個數超出了int類型的取值範圍,且在long類型的取值範圍内時,使用long類型。然而,對于那些long占用的空間比int大的系統,使用long類型會減慢運算速度。因此,如非必要,請不要使用long類型。另外要注意一點:如果在long類型和int類型占用空間相同的機器上編寫代碼,當确實需要32位的整數時,應使用long類型而不是int類型,以便把程序移植到16位機後仍然可以正常工作。類似地,如果确實需要64位的整數,應使用long long類型。

如果在int設置為32位的系統中要使用16位的值,應使用short類型以節省存儲空間。通常,隻有當程序使用相對于系統可用内存較大的整型數組時,才需要重點考慮節省空間的問題。使用short類型的另一個原因是,計算機中某些組件使用的硬件寄存器是16位。

3.long常量和long long常量

通常,程序代碼中使用的數字(如,2345)都被儲存為int類型。如果使用1000000這樣的大數字,超出了int類型能表示的範圍,編譯器會将其視為long int類型(假設這種類型可以表示該數字)。如果數字超出long可表示的最大值,編譯器則将其視為unsigned long類型。如果還不夠大,編譯器則将其視為long long或unsigned long long類型(前提是編譯器能識别這些類型)。

八進制和十六進制常量被視為int類型。如果值太大,編譯器會嘗試使用unsigned int。如果還不夠大,編譯器會依次使用long、unsigned long、long long和unsigned long long類型。

有些情況下,需要編譯器以long類型儲存一個小數字。例如,編程時要顯式使用IBM PC上的内存地址時。另外,一些C标準函數也要求使用long類型的值。要把一個較小的常量作為long類型對待,可以在值的末尾加上l(小寫的L)或L後綴。使用L後綴更好,因為l看上去和數字1很像。因此,在int為16位、long為32位的系統中,會把7作為16位儲存,把7L作為32位儲存。l或L後綴也可用于八進制和十六進制整數,如020L和0x10L。

類似地,在支持long long類型的系統中,也可以使用ll或LL後綴來表示long long類型的值,如3LL。另外,u或U後綴表示unsigned long long,如5ull、10LLU、6LLU或9Ull。

整數溢出

如果整數超出了相應類型的取值範圍會怎樣?下面分别将有符号類型和無符号類型的整數設置為比最大值略大,看看會發生什麼(printf()函數使用%u說明顯示unsigned int類型的值)。

/* toobig.c-- 超出系統允許的最大int值*/ #include <stdio.h> int main(void) { int i = 2147483647; unsigned int j = 4294967295; printf("%d %d %d\n", i, i 1, i 2); printf("%u %u %u\n", j, j 1, j 2); return 0; }

在我們的系統下輸出的結果是:

2147483647 -2147483648 -2147483647 4294967295 0 1

可以把無符号整數j看作是汽車的裡程表。當達到它能表示的最大值時,會重新從起始點開始。整數i也是類似的情況。它們主要的區别是,在超過最大值時,unsigned int類型的變量j從0開始;而int類型的變量i則從−2147483648開始。注意,當i超出(溢出)其相應類型所能表示的最大值時,系統并未通知用戶。因此,在編程時必須自己注意這類問題。

溢出行為是未定義的行為,C标準并未定義有符号類型的溢出規則。以上描述的溢出行為比較有代表性,但是也可能會出現其他情況。

4.打印short、long、long long和unsigned類型

打印unsigned int類型的值,使用%u轉換說明;打印long類型的值,使用%ld轉換說明。如果系統中int和long的大小相同,使用%d就行。但是,這樣的程序被移植到其他系統(int和long類型的大小不同)中會無法正常工作。在x和o前面可以使用l前綴,%lx表示以十六進制格式打印long類型整數,%lo表示以八進制格式打印long類型整數。注意,雖然C允許使用大寫或小寫的常量後綴,但是在轉換說明中隻能用小寫。

C語言有多種printf()格式。對于short類型,可以使用h前綴。%hd表示以十進制顯示short類型的整數,%ho表示以八進制顯示short類型的整數。h和l前綴都可以和u一起使用,用于表示無符号類型。例如,%lu表示打印unsigned long類型的值。程序清單3.4演示了一些例子。對于支持long long類型的系統,%lld和%llu分别表示有符号和無符号類型。第4章将詳細介紹轉換說明。

程序清單3.4 print2.c程序

/* print2.c--更多printf()的特性 */ #include <stdio.h> int main(void) { unsigned int un = 3000000000; /* int為32位和short為16位的系統 */ short end = 200; long big = 65537; long long verybig = 12345678908642; printf("un = %u and not %d\n", un, un); printf("end = %hd and %d\n", end, end); printf("big = %ld and not %hd\n", big, big); printf("verybig= %lld and not %ld\n", verybig, verybig); return 0; }

在特定的系統中輸出如下(輸出的結果可能不同):

un = 3000000000 and not -1294967296 end = 200 and 200 big = 65537 and not 1 verybig= 12345678908642 and not 1942899938

該例表明,使用錯誤的轉換說明會得到意想不到的結果。第1行輸出,對于無符号變量un,使用%d會生成負值!其原因是,無符号值3000000000和有符号值−129496296在系統内存中的内部表示完全相同(詳見第15章)。因此,如果告訴printf()該數是無符号數,它打印一個值;如果告訴它該數是有符号數,它将打印另一個值。在待打印的值大于有符号值的最大值時,會發生這種情況。對于較小的正數(如96),有符号和無符号類型的存儲、顯示都相同。

第2行輸出,對于short類型的變量end,在printf()中無論指定以short類型(%hd)還是int類型(%d)打印,打印出來的值都相同。這是因為在給函數傳遞參數時,C編譯器把short類型的值自動轉換成int類型的值。你可能會提出疑問:為什麼要進行轉換?h修飾符有什麼用?第1個問題的答案是,int類型被認為是計算機處理整數類型時最高效的類型。因此,在short和int類型的大小不同的計算機中,用int類型的參數傳遞速度更快。第2個問題的答案是,使用h修飾符可以顯示較大整數被截斷成short類型值的情況。第 3 行輸出就演示了這種情況。把 65537 以二進制格式寫成一個 32 位數是00000000000000010000000000000001。使用%hd,printf()隻會查看後16位,所以顯示的值是1。與此類似,輸出的最後一行先顯示了verybig的完整值,然後由于使用了%ld,printf()隻顯示了儲存在後32位的值。

本章前面介紹過,程序員必須确保轉換說明的數量和待打印值的數量相同。以上内容也提醒讀者,程序員還必須根據待打印值的類型使用正确的轉換說明。

提示

匹配printf()說明符的類型

在使用printf()函數時,切記檢查每個待打印值都有對應的轉換說明,還要檢查轉換說明的類型是否與待打印值的類型相匹配。

3.4.3 使用字符:char類型

char類型用于儲存字符(如,字母或标點符号),但是從技術層面看,char是整數類型。因為char類型實際上儲存的是整數而不是字符。計算機使用數字編碼來處理字符,即用特定的整數表示特定的字符。美國最常用的編碼是ASCII編碼,本書也使用此編碼。例如,在ASCII碼中,整數65代表大寫字母A。因此,儲存字母A實際上儲存的是整數65(許多IBM的大型主機使用另一種編碼——EBCDIC,其原理相同。另外,其他國家的計算機系統可能使用完全不同的編碼)。

标準ASCII碼的範圍是0~127,隻需7位二進制數即可表示。通常,char類型被定義為8位的存儲單元,因此容納标準ASCII碼綽綽有餘。許多其他系統(如IMB PC和蘋果Macs)還提供擴展ASCII碼,也在8位的表示範圍之内。一般而言,C語言會保證char類型足夠大,以儲存系統(實現C語言的系統)的基本字符集。

許多字符集都超過了127,甚至多于255。例如,日本漢字(kanji)字符集。商用的統一碼(Unicode)創建了一個能表示世界範圍内多種字符集的系統,目前包含的字符已超過110000個。國際标準化組織(ISO)和國際電工技術委員會(IEC)為字符集開發了ISO/IEC 10646标準。統一碼标準也與ISO/IEC 10646标準兼容。

C語言把1字節定義為char類型占用的位(bit)數,因此無論是16位還是32位系統,都可以使用char類型。

1.聲明char類型變量

char類型變量的聲明方式與其他類型變量的聲明方式相同。下面是一些例子:

char response; char itable, latan;

以上聲明創建了3個char類型的變量:response、itable和latan。

2.字符常量和初始化

如果要把一個字符常量初始化為字母A,不必背下ASCII碼,用計算機語言很容易做到。通過以下初始化把字母A賦給grade即可:

char grade = 'A';

在C語言中,用單引号括起來的單個字符被稱為字符常量(character constant)。編譯器一發現'A',就會将其轉換成相應的代碼值。單引号必不可少。下面還有一些其他的例子:

char broiled; /* 聲明一個char類型的變量 */ broiled = 'T'; /* 為其賦值,正确 */ broiled = T; /* 錯誤!此時T是一個變量 */ broiled = "T"; /* 錯誤!此時"T"是一個字符串 */

如上所示,如果省略單引号,編譯器認為T是一個變量名;如果把T用雙引号括起來,編譯器則認為"T"是一個字符串。字符串的内容将在第4章中介紹。

實際上,字符是以數值形式儲存的,所以也可使用數字代碼值來賦值:

char grade = 65; /* 對于ASCII,這樣做沒問題,但這是一種不好的編程風格 */

在本例中,雖然65是int類型,但是它在char類型能表示的範圍内,所以将其賦值給grade沒問題。由于65是字母A對應的ASCII碼,因此本例是把A賦給grade。注意,能這樣做的前提是系統使用ASCII碼。其實,用'A'代替65才是較為妥當的做法,這樣在任何系統中都不會出問題。因此,最好使用字符常量,而不是數字代碼值。

奇怪的是,C語言将字符常量視為int類型而非char類型。例如,在int為32位、char為8位的ASCII系統中,有下面的代碼:

char grade = 'B';

本來'B'對應的數值66儲存在32位的存儲單元中,現在卻可以儲存在8位的存儲單元中(grade)。利用字符常量的這種特性,可以定義一個字符常量'FATE',即把4個獨立的8位ASCII碼儲存在一個32位存儲單元中。如果把這樣的字符常量賦給char類型變量grade,隻有最後8位有效。因此,grade的值是'E'。

3.非打印字符

單引号隻适用于字符、數字和标點符号,浏覽ASCII表會發現,有些ASCII字符打印不出來。例如,一些代表行為的字符(如,退格、換行、終端響鈴或蜂鳴)。C語言提供了3種方法表示這些字符。

第1種方法前面介紹過——使用ASCII碼。例如,蜂鳴字符的ASCII值是7,因此可以這樣寫:

char beep = 7;

第2種方法是,使用特殊的符号序列表示一些特殊的字符。這些符号序列叫作轉義序列(escape sequence)。表3.2列出了轉義序列及其含義。

把轉義序列賦給字符變量時,必須用單引号把轉義序列括起來。例如,假設有下面一行代碼:

char nerf = '\n';

稍後打印變量nerf的效果是,在打印機或屏幕上另起一行。

表3.2 轉義序列

轉義序列

含義

\a

警報(ANSI C)

\b

退格

\f

換頁

\n

換行

\r

回車

\t

水平制表符

\v

垂直制表符

\\

反斜杠(\)

\'

單引号

\"

雙引号

\?

問号

\0oo

八進制值(oo必須是有效的八進制數,即每個o可表示0~7中的一個數)

\xhh

十六進制值(hh必須是有效的十六進制數,即每個h可表示0~f中的一個數)

現在,我們來仔細分析一下轉義序列。使用C90新增的警報字符(\a)是否能産生聽到或看到的警報,取決于計算機的硬件,蜂鳴是最常見的警報(在一些系統中,警報字符不起作用)。C标準規定警報字符不得改變活躍位置。标準中的活躍位置(active position)指的是顯示設備(屏幕、電傳打字機、打印機等)中下一個字符将出現的位置。簡而言之,平時常說的屏幕光标位置就是活躍位置。在程序中把警報字符輸出在屏幕上的效果是,發出一聲蜂鳴,但不會移動屏幕光标。

接下來的轉義字符\b、\f、\n、\r、\t和\v是常用的輸出設備控制字符。了解它們最好的方式是查看它們對活躍位置的影響。換頁符(\f)把活躍位置移至下一頁的開始處;換行符(\n)把活躍位置移至下一行的開始處;回車符(\r)把活躍位置移動到當前行的開始處;水平制表符(\t)将活躍位置移至下一個水平制表點(通常是第1個、第9個、第17個、第25個等字符位置);垂直制表符(\v)把活躍位置移至下一個垂直制表點。

這些轉義序列字符不一定在所有的顯示設備上都起作用。例如,換頁符和垂直制表符在PC屏幕上會生成奇怪的符号,光标并不會移動。隻有将其輸出到打印機上時才會産生前面描述的效果。

接下來的3個轉義序列(\\、\'、\")用于打印\、'、"字符(由于這些字符用于定義字符常量,是printf()函數的一部分,若直接使用它們會造成混亂)。如果打印下面一行内容:

Gramps sez, "a \ is a backslash."

應這樣編寫代碼:

printf("Gramps sez, \"a \\ is a backslash.\"\n");

表3.2中的最後兩個轉義序列(\0oo和\xhh)是ASCII碼的特殊表示。如果要用八進制ASCII碼表示一個字符,可以在編碼值前面加一個反斜杠(\)并用單引号括起來。例如,如果編譯器不識别警報字符(\a),可以使用ASCII碼來代替:

beep = '\007';

可以省略前面的0,'\07'甚至'\7'都可以。即使沒有前綴0,編譯器在處理這種寫法時,仍會解釋為八進制。

從C90開始,不僅可以用十進制、八進制形式表示字符常量,C語言還提供了第3種選擇——用十六進制形式表示字符常量,即反斜杠後面跟一個x或X,再加上1~3位十六進制數字。例如,Ctrl P字符的ASCII十六進制碼是10(相當于十進制的16),可表示為'\x10'或'\x010'。圖3.5列出了一些整數類型的不同進制形式。

c語言提供的數據類型有哪些(C語言基本數據類型有哪些)2

圖3.5 int系列類型的常量寫法示例

使用ASCII碼時,注意數字和數字字符的區别。例如,字符4對應的ASCII碼是52。'4'表示字符4,而不是數值4。

關于轉義序列,讀者可能有下面3個問題。

  • 上面最後一個例子(printf("Gramps sez, \"a \\ is a backslash.\"\n");),為何沒有用單引号把轉義序列括起來?無論是普通字符還是轉義序列,隻要是雙引号括起來的字符集合,就無需用單引号括起來。雙引号中的字符集合叫作字符串(詳見第4章)。注意,該例中的其他字符(G、r、a、m、p、s等)都沒有用單引号括起來。與此類似,printf("Hello!\007\n");将打印Hello!并發出一聲蜂鳴,而printf("Hello!7\n");則打印Hello!7。不是轉義序列中的數字将作為普通字符被打印出來。
  • 何時使用ASCII碼?何時使用轉義序列?如果要在轉義序列(假設使用'\f')和ASCII碼('\014')之間選擇,請選擇前者(即'\f')。這樣的寫法不僅更好記,而且可移植性更高。'\f'在不使用ASCII碼的系統中,仍然有效。
  • 如果要使用ASCII碼,為何要寫成'\032'而不是032?首先,'\032'能更清晰地表達程序員使用字符編碼的意圖。其次,類似\032這樣的轉義序列可以嵌入C的字符串中,如printf("Hello!\007\n");中就嵌入了\007。
4.打印字符

printf()函數用%c指明待打印的字符。前面介紹過,一個字符變量實際上被儲存為1字節的整數值。因此,如果用%d轉換說明打印char類型變量的值,打印的是一個整數。而%c轉換說明告訴printf()打印該整數值對應的字符。程序清單3.5演示了打印char類型變量的兩種方式。

程序清單3.5 charcode.c程序

/* charcode.c-顯示字符的代碼編号 */ #include <stdio.h> int main(void) { char ch; printf("Please enter a character.\n"); scanf("%c", &ch); /* 用戶輸入字符 */ printf("The code for %c is %d.\n", ch, ch); return 0; }

運行該程序後,輸出示例如下:

Please enter a character. C The code for C is 67.

運行該程序時,在輸入字母後不要忘記按下EnterReturn鍵。随後,scanf()函數會讀取用戶輸入的字符,&符号表示把輸入的字符賦給變量ch。接着,printf()函數打印ch的值兩次,第1次打印一個字符(對應代碼中的%c),第2次打印一個十進制整數值(對應代碼中的%d)。注意,printf()函數中的轉換說明決定了數據的顯示方式,而不是數據的儲存方式(見圖3.6)。

c語言提供的數據類型有哪些(C語言基本數據類型有哪些)3

圖3.6 數據顯示和數據存儲

5.有符号還是無符号

有些C編譯器把char實現為有符号類型,這意味着char可表示的範圍是-128~127。而有些C編譯器把char實現為無符号類型,那麼char可表示的範圍是0~255。請查閱相應的編譯器手冊,确定正在使用的編譯器如何實現char類型。或者,可以查閱limits.h頭文件。下一章将詳細介紹頭文件的内容。

根據C90标準,C語言允許在關鍵字char前面使用signed或unsigned。這樣,無論編譯器默認char是什麼類型,signed char表示有符号類型,而unsigned char表示無符号類型。這在用char類型處理小整數時很有用。如果隻用char處理字符,那麼char前面無需使用任何修飾符。

3.4.4 _Bool類型

C99标準添加了_Bool類型,用于表示布爾值,即邏輯值true和false。因為C語言用值1表示true,值0表示false,所以_Bool類型實際上也是一種整數類型。但原則上它僅占用1位存儲空間,因為對0和1而言,1位的存儲空間足夠了。

程序通過布爾值可選擇執行哪部分代碼。我們将在第6章和第7章中詳述相關内容。

3.4.5 可移植類型:stdint.h和inttypes.h

C語言提供了許多有用的整數類型。但是,某些類型名在不同系統中的功能不一樣。C99新增了兩個頭文件stdint.h和inttypes.h,以确保C語言的類型在各系統中的功能相同。

C語言為現有類型創建了更多類型名。這些新的類型名定義在stdint.h頭文件中。例如,int32_t表示32位的有符号整數類型。在使用32位int的系統中,頭文件會把int32_t作為int的别名。不同的系統也可以定義相同的類型名。例如,int為16位、long為32位的系統會把int32_t作為long的别名。然後,使用int32_t類型編寫程序,并包含stdint.h頭文件時,編譯器會把int或long替換成與當前系統匹配的類型。

上面讨論的類型别名是精确寬度整數類型(exact-width integer type)的示例。int32_t表示整數類型的寬度正好是32位。但是,計算機的底層系統可能不支持。因此,精确寬度整數類型是可選項。

如果系統不支持精确寬度整數類型怎麼辦?C99和C11提供了第2類别名集合。一些類型名保證所表示的類型一定是至少有指定寬度的最小整數類型。這組類型集合被稱為最小寬度類型(minimum width type)。例如,int_least8_t是可容納8位有符号整數值的類型中寬度最小的類型的一個别名。如果某系統的最小整數類型是16位,可能不會定義int8_t類型。盡管如此,該系統仍可使用int_least8_t類型,但可能把該類型實現為16位的整數類型。

當然,一些程序員更關心速度而非空間。為此,C99和C11定義了一組可使計算達到最快的類型集合。這組類型集合被稱為最快最小寬度類型(fastst minimum width type)。例如,int_fast8_t被定義為系統中對8位有符号值而言運算最快的整數類型的别名。

另外,有些程序員需要系統的最大整數類型。為此,C99定義了最大的有符号整數類型intmax_t,可儲存任何有效的有符号整數值。類似地,uintmax_t表示最大的無符号整數類型。順帶一提,這些類型有可能比long long和unsigned long類型更大,因為C編譯器除了實現标準規定的類型以外,還可利用C語言實現其他類型。例如,一些編譯器在标準引入long long類型之前,已提前實現了該類型。

C99和C11不僅提供可移植的類型名,還提供相應的輸入和輸出。例如,printf()打印特定類型時要求與相應的轉換說明匹配。如果要打印int32_t類型的值,有些定義使用%d,而有些定義使用%ld,怎麼辦?C标準針對這一情況,提供了一些字符串宏(第4章中詳細介紹)來顯示可移植類型。例如,inttypes.h頭文件中定義了PRId32字符串宏,代表打印32位有符号值的合适轉換說明(如d或l)。程序清單3.6演示了一種可移植類型和相應轉換說明的用法。

程序清單3.6 altnames.c程序

/* altnames.c -- 可移植整數類型名 */ #include <stdio.h> #include <inttypes.h> // 支持可移植類型 int main(void) { int32_t me32; // me32是一個32位有符号整型變量 me32 = 45933945; printf("First, assume int32_t is int: "); printf("me32 = %d\n", me32); printf("Next, let's not make any assumptions.\n"); printf("Instead, use a \"macro\" from inttypes.h: "); printf("me32 = %" "d" "\n", me32); return 0; }

該程序最後一個printf()中,參數PRId32被定義在inttypes.h中的"d"替換,因而這條語句等價于:

printf(“me32 = %d\n”, me32);

在C語言中,可以把多個連續的字符串組合成一個字符串,所以這條語句又等價于:

printf("me32 = %d\n", me32);

下面是該程序的輸出,注意,程序中使用了\"轉義序列來顯示雙引号:

First, assume int32_t is int: me32 = 45933945 Next, let's not make any assumptions. Instead, use a "macro" from inttypes.h: me32 = 45933945

篇幅有限,無法介紹擴展的所有整數類型。本節主要是為了讓讀者知道,在需要時可進行這種級别的類型控制。附錄B中的參考資料VI“擴展的整數類型”介紹了完整的inttypes.h和stdint.h頭文件。

注意

對C99/C11的支持

C語言發展至今,雖然ISO已發布了C11标準,但是編譯器供應商對C99的實現程度卻各不相同。在本書第6版的編寫過程中,一些編譯器仍未實現inttypes.h頭文件及其相關功能。

3.4.6 float、double和long double

各種整數類型對大多數軟件開發項目而言夠用了。然而,面向金融和數學的程序經常使用浮點數。C語言中的浮點類型有float、double和long double類型。它們與FORTRAN和Pascal中的real類型一緻。前面提到過,浮點類型能表示包括小數在内更大範圍的數。浮點數的表示類似于科學記數法(即用小數乘以10的幂來表示數字)。該記數系統常用于表示非常大或非常小的數。表3.3列出了一些示例。

表3.3 記數法示例

數字

科學記數法

指數記數法

1000000000

1.0×109

1.0e9

123000

1.23×105

1.23e5

322.56

3.2256×102

3.2256e2

0.000056

5.6×10-5

5.6e-5

第1列是一般記數法;第2列是科學記數法;第3列是指數記數法(或稱為e記數法),這是科學記數法在計算機中的寫法,e後面的數字代表10的指數。圖3.7演示了更多的浮點數寫法。

c語言提供的數據類型有哪些(C語言基本數據類型有哪些)4

圖3.7 更多浮點數寫法示例

C标準規定,float類型必須至少能表示6位有效數字,且取值範圍至少是10-37~10 37。前一項規定指float類型必須能夠表示33.333333的前6位數字,而不是精确到小數點後6位數字。後一項規定用于方便地表示諸如太陽質量(2.0e30千克)、一個質子的電荷量(1.6e-19庫侖)或國家債務之類的數字。通常,系統儲存一個浮點數要占用32位。其中8位用于表示指數的值和符号,剩下24位用于表示非指數部分(也叫作尾數或有效數)及其符号。

C語言提供的另一種浮點類型是double(意為雙精度)。double類型和float類型的最小取值範圍相同,但至少必須能表示10位有效數字。一般情況下,double占用64位而不是32位。一些系統将多出的32位全部用來表示非指數部分,這不僅增加了有效數字的位數(即提高了精度),而且還減少了舍入誤差。另一些系統把其中的一些位分配給指數部分,以容納更大的指數,從而增加了可表示數的範圍。無論哪種方法,double類型的值至少有13位有效數字,超過了标準的最低位數規定。

C語言的第3種浮點類型是long double,以滿足比double類型更高的精度要求。不過,C隻保證long double類型至少與double類型的精度相同。

1.聲明浮點型變量

浮點型變量的聲明和初始化方式與整型變量相同,下面是一些例子:

float noah, jonah; double trouble; float planck = 6.63e-34; long double gnp;

2.浮點型常量

在代碼中,可以用多種形式書寫浮點型常量。浮點型常量的基本形式是:有符号的數字(包括小數點),後面緊跟e或E,最後是一個有符号數表示10的指數。下面是兩個有效的浮點型常量:

-1.56E 12 2.87e-3

正号可以省略。可以沒有小數點(如,2E5)或指數部分(如,19.28),但是不能同時省略兩者。可以省略小數部分(如,3.E16)或整數部分(如,.45E-6),但是不能同時省略兩者。下面是更多的有效浮點型常量示例:

3.14159 .2 4e16 .8E-5 100.

不要在浮點型常量中間加空格:1.56 E 12(錯誤!)

默認情況下,編譯器假定浮點型常量是double類型的精度。例如,假設some是float類型的變量,編寫下面的語句:

some = 4.0 * 2.0;

通常,4.0和2.0被儲存為64位的double類型,使用雙精度進行乘法運算,然後将乘積截斷成float類型的寬度。這樣做雖然計算精度更高,但是會減慢程序的運行速度。

在浮點數後面加上f或F後綴可覆蓋默認設置,編譯器會将浮點型常量看作float類型,如2.3f和9.11E9F。使用l或L後綴使得數字成為long double類型,如54.3l和4.32L。注意,建議使用L後綴,因為字母l和數字1很容易混淆。沒有後綴的浮點型常量是double類型。

C99标準添加了一種新的浮點型常量格式——用十六進制表示浮點型常量,即在十六進制數前加上十六進制前綴(0x或0X),用p和P分别代替e和E,用2的幂代替10的幂(即,p計數法)。如下所示:

0xa.1fp10

十六進制a等于十進制10,.1f是1/16加上15/256(十六進制f等于十進制15),p10是210或1024。0xa.1fp10表示的值是(10 1/16 15/256)×1024(即,十進制10364.0)。

注意,并非所有的編譯器都支持C99的這一特性。

3.打印浮點值

printf()函數使用%f轉換說明打印十進制記數法的float和double類型浮點數,用%e打印指數記數法的浮點數。如果系統支持十六進制格式的浮點數,可用a和A分别代替e和E。打印long double類型要使用%Lf、%Le或%La轉換說明。給那些未在函數原型中顯式說明參數類型的函數(如,printf())傳遞參數時,C編譯器會把float類型的值自動轉換成double類型。程序清單3.7演示了這些特性。

程序清單3.7 showf_pt.c程序

/* showf_pt.c -- 以兩種方式顯示float類型的值 */ #include <stdio.h> int main(void) { float aboat = 32000.0; double abet = 2.14e9; long double dip = 5.32e-5; printf("%f can be written %e\n", aboat, aboat); // 下一行要求編譯器支持C99或其中的相關特性 printf("And it's %a in hexadecimal, powers of 2 notation\n", aboat); printf("%f can be written %e\n", abet, abet); printf("%Lf can be written %Le\n", dip, dip); return 0; }

該程序的輸出如下,前提是編譯器支持C99/C11:

32000.000000 can be written 3.200000e 04 And it's 0x1.f4p 14 in hexadecimal, powers of 2 notation 2140000000.000000 can be written 2.140000e 09 0.000053 can be written 5.320000e-05

該程序示例演示了默認的輸出效果。下一章将介紹如何通過設置字段寬度和小數位數來控制輸出格式。

4.浮點值的上溢和下溢

假設系統的最大float類型值是3.4E38,編寫如下代碼:

float toobig = 3.4E38 * 100.0f; printf("%e\n", toobig);

會發生什麼?這是一個上溢(overflow)的示例。當計算導緻數字過大,超過當前類型能表達的範圍時,就會發生上溢。這種行為在過去是未定義的,不過現在C語言規定,在這種情況下會給toobig賦一個表示無窮大的特定值,而且printf()顯示該值為inf或infinity(或者具有無窮含義的其他内容)。

當對一個很小的數做除法時,情況更為複雜。回憶一下,float類型的數以指數和尾數部分來儲存。存在這樣一個數,它的指數部分是最小值,即由全部可用位表示的最小尾數值。該數字是float類型能用全部精度表示的最小數字。現在把它除以2。通常,這個操作會減小指數部分,但是假設的情況中,指數已經是最小值了。所以計算機隻好把尾數部分的位向右移,空出第1個二進制位,并丢棄最後一個二進制數。以十進制為例,把一個有4位有效數字的數(如,0.1234E-10)除以10,得到的結果是0.0123E-10。雖然得到了結果,但是在計算過程中卻損失了原末尾有效位上的數字。這種情況叫作下溢(underflow)。C語言把損失了類型全精度的浮點值稱為低于正常的(subnormal)浮點值。因此,把最小的正浮點數除以2将得到一個低于正常的值。如果除以一個非常大的值,會導緻所有的位都為0。現在,C庫已提供了用于檢查計算是否會産生低于正常值的函數。

還有另一個特殊的浮點值NaN(not a number的縮寫)。例如,給asin()函數傳遞一個值,該函數将返回一個角度,該角度的正弦就是傳入函數的值。但是正弦值不能大于1,因此,如果傳入的參數大于1,該函數的行為是未定義的。在這種情況下,該函數将返回NaN值,printf()函數可将其顯示為nan、NaN或其他類似的内容。

浮點數舍入錯誤

給定一個數,加上1,再減去原來給定的數,結果是多少?你一定認為是1。但是,下面的浮點運算給出了不同的答案:

/* floaterr.c--演示舍入錯誤 */ #include <stdio.h> int main(void) { float a,b; b = 2.0e20 1.0; a = b - 2.0e20; printf("%f \n", a); return 0; }

該程序的輸出如下:

0.000000 ←Linux系統下的老式gcc -13584010575872.000000 ←Turbo C 1.5 4008175468544.000000 ←XCode 4.5、Visual Studio 2012、當前版本的gcc

得出這些奇怪答案的原因是,計算機缺少足夠的小數位來完成正确的運算。2.0e20是2後面有20個0。如果把該數加1,那麼發生變化的是第21位。要正确運算,程序至少要儲存21位數字。而float類型的數字通常隻能儲存按指數比例縮小或放大的6或7位有效數字。在這種情況下,計算結果一定是錯誤的。另一方面,如果把2.0e20改成2.0e4,計算結果就沒問題。因為2.0e4加1隻需改變第5位上的數字,float類型的精度足夠進行這樣的計算。

浮點數表示法

上一個方框中列出了由于計算機使用的系統不同,一個程序有不同的輸出。原因是,根據前面介紹的知識,實現浮點數表示法的方法有多種。為了盡可能地統一實現,電子和電氣工程師協會(IEEE)為浮點數計算和表示法開發了一套标準。現在,許多硬件浮點單元都采用該标準。2011年,該标準被ISO/IEC/IEEE 60559:2011标準收錄。該标準作為C99和C11的可選項,符合硬件要求的平台可開啟。floaterr.c程序的第3個輸出示例即是支持該浮點标準的系統顯示的結果。支持C标準的編譯器還包含捕獲異常問題的工具。詳見附錄B.5,參考資料V。

3.4.7 複數和虛數類型

許多科學和工程計算都要用到複數和虛數。C99标準支持複數類型和虛數類型,但是有所保留。一些獨立實現,如嵌入式處理器的實現,就不需要使用複數和虛數(VCR芯片就不需要複數)。一般而言,虛數類型都是可選項。C11标準把整個複數軟件包都作為可選項。

簡而言之,C語言有3種複數類型:float _Complex、double _Complex和long double _Complex。例如,float _Complex類型的變量應包含兩個float類型的值,分别表示複數的實部和虛部。類似地,C語言的3種虛數類型是float _Imaginary、double _Imaginary和long double _Imaginary。

如果包含complex.h頭文件,便可用complex代替_Complex,用imaginary代替_Imaginary,還可以用I代替-1的平方根。

為何C标準不直接用complex作為關鍵字來代替_Complex,而要添加一個頭文件(該頭文件中把complex定義為_Complex)?因為标準委員會考慮到,如果使用新的關鍵字,會導緻以該關鍵字作為标識符的現有代碼全部失效。例如,之前的C99,許多程序員已經使用struct complex定義一個結構來表示複數或者心理學程序中的心理狀況(關鍵字struct用于定義能儲存多個值的結構,詳見第14章)。讓complex成為關鍵字會導緻之前的這些代碼出現語法錯誤。但是,使用struct _Complex的人很少,特别是标準使用首字母是下劃線的标識符作為預留字以後。因此,标準委員會選定_Complex作為關鍵字,在不用考慮名稱沖突的情況下可選擇使用complex。

3.4.8 其他類型

現在已經介紹完C語言的所有基本數據類型。有些人認為這些類型實在太多了,但有些人覺得還不夠用。注意,雖然C語言沒有字符串類型,但也能很好地處理字符串。第4章将詳細介紹相關内容。

C語言還有一些從基本類型衍生的其他類型,包括數組、指針、結構和聯合。盡管後面章節中會詳細介紹這些類型,但是本章的程序示例中已經用到了指針〔指針(pointer)指向變量或其他數據對象位置〕。例如,在scanf()函數中用到的前綴&,便創建了一個指針,告訴scanf()把數據放在何處。

小結:基本數據類型

關鍵字:

基本數據類型由11個關鍵字組成:int、long、short、unsigned、char、float、double、signed、_Bool、_Complex和_Imaginary。

有符号整型:

有符号整型可用于表示正整數和負整數。

int ——系統給定的基本整數類型。C語言規定int類型不小于16位。short或short int ——最大的short類型整數小于或等于最大的int類型整數。C語言規定short類型至少占16位。long或long int ——該類型可表示的整數大于或等于最大的int類型整數。C語言規定long類型至少占32位。long long或long long int ——該類型可表示的整數大于或等于最大的long類型整數。long long類型至少占64位。

一般而言,long類型占用的内存比short類型大,int類型的寬度要麼和long類型相同,要麼和short類型相同。例如,舊DOS系統的PC提供16位的short和int,以及32位的long;Windows 95系統提供16位的short以及32位的int和long。

無符号整型:

無符号整型隻能用于表示零和正整數,因此無符号整型可表示的正整數比有符号整型的大。在整型類型前加上關鍵字unsigned表明該類型是無符号整型:unsigned int、unsigned long、unsigned short。單獨的unsigned相當于unsigned int。

字符類型:

可打印出來的符号(如A、&和 )都是字符。根據定義,char類型表示一個字符要占用1字節内存。出于曆史原因,1字節通常是8位,但是如果要表示基本字符集,也可以是16位或更大。

char ——字符類型的關鍵字。有些編譯器使用有符号的char,而有些則使用無符号的char。在需要時,可在char前面加上關鍵字signed或unsigned來指明具體使用哪一種類型。

布爾類型:

布爾值表示true和false。C語言用1表示true,0表示false。

_Bool ——布爾類型的關鍵字。布爾類型是無符号int類型,所占用的空間隻要能儲存0或1即可。

實浮點類型:

實浮點類型可表示正浮點數和負浮點數。

float ——系統的基本浮點類型,可精确表示至少6位有效數字。double ——儲存浮點數的範圍(可能)更大,能表示比float類型更多的有效數字(至少10位,通常會更多)和更大的指數。long double ——儲存浮點數的範圍(可能)比double更大,能表示比double更多的有效數字和更大的指數。

複數和虛數浮點數:

虛數類型是可選的類型。複數的實部和虛部類型都基于實浮點類型來構成:

float _Complexdouble _Complexlong double _Complexfloat _Imaginarydouble _Imaginarylong double _Imaginary

小結:如何聲明簡單變量

1.選擇需要的類型。

2.使用有效的字符給變量起一個變量名。

3.按以下格式進行聲明:

類型說明符 變量名;

類型說明符由一個或多個關鍵字組成。下面是一些示例:

int erest; unsigned short cash;

4.可以同時聲明相同類型的多個變量,用逗号分隔各變量名,如下所示:

char ch, init, ans;

5.在聲明的同時還可以初始化變量:

float mass = 6.0E24;

3.4.9 類型大小

如何知道當前系統的指定類型的大小是多少?運行程序清單3.8,會列出當前系統的各類型的大小。

程序清單3.8 typesize.c程序

/* typesize.c -- 打印類型大小 */ #include <stdio.h> int main(void) { /* C99為類型大小提供%zd轉換說明 */ printf("Type int has a size of %zd bytes.\n", sizeof(int)); printf("Type char has a size of %zd bytes.\n", sizeof(char)); printf("Type long has a size of %zd bytes.\n", sizeof(long)); printf("Type long long has a size of %zd bytes.\n", sizeof(long long)); printf("Type double has a size of %zd bytes.\n", sizeof(double)); printf("Type long double has a size of %zd bytes.\n", sizeof(long double)); return 0; }

sizeof是C語言的内置運算符,以字節為單位給出指定類型的大小。C99和C11提供%zd轉換說明匹配sizeof的返回類型[2]。一些不支持C99和C11的編譯器可用%u或%lu代替%zd。

該程序的輸出如下:

Type int has a size of 4 bytes. Type char has a size of 1 bytes. Type long has a size of 8 bytes. Type long long has a size of 8 bytes. Type double has a size of 8 bytes. Type long double has a size of 16 bytes.

該程序列出了6種類型的大小,你也可以把程序中的類型更換成感興趣的其他類型。注意,因為C語言定義了char類型是1字節,所以char類型的大小一定是1字節。而在char類型為16位、double類型為64位的系統中,sizeof給出的double是4字節。在limits.h和float.h頭文件中有類型限制的相關信息(下一章将詳細介紹這兩個頭文件)。

順帶一提,注意該程序最後幾行printf()語句都被分為兩行,隻要不在引号内部或一個單詞中間斷行,就可以這樣寫。

本文摘自《C Primer Plus(第6版)》中文版

c語言提供的數據類型有哪些(C語言基本數據類型有哪些)5

  • 經久不衰的C語言暢銷經典教程
  • 中文版累計銷量近百萬冊
  • 針對C11标準進行全面更新

本書詳細講解了C語言的基本概念和編程技巧。

全書共17章。第1章、第2章介紹了C語言編程的預備知識。第3章~第15章詳細講解了C語言的相關知識,包括數據類型、格式化輸入/輸出、運算符、表達式、語句、循環、字符輸入和輸出、函數、數組和指針、字符和字符串函數、内存管理、文件輸入輸出、結構、位操作等。第16章、第17章介紹C預處理器、C庫和高級數據表示。本書以完整的程序為例,講解C語言的知識要點和注意事項。每章末尾設計了大量複習題和編程練習,幫助讀者鞏固所學知識和提高實際編程能力。附錄給出了各章複習題的參考答案和豐富的參考資料。

本書可作為C語言的教材,适用于需要系統學習C語言的初學者,也适用于鞏固C語言知識或希望進一步提高編程技術的程序員。

,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关科技资讯推荐

热门科技资讯推荐

网友关注

Copyright 2023-2024 - www.tftnews.com All Rights Reserved