??C++是C語(yǔ)言的一個(gè)超集。C++有一個(gè)眾所周知的特性:對(duì)C語(yǔ)言的高度兼容。這樣的兼容性不僅體現(xiàn)在程序員可以較為容易地將C代碼“升級(jí)”為C++代碼上,也體現(xiàn)在C代碼可以被C++的編譯器所編譯上。 ??C++的第一個(gè)標(biāo)準(zhǔn)是1998年制定的C++98,而C的第二個(gè)官方標(biāo)準(zhǔn)是1999年制定C99,C99制定時(shí),借鑒了很多C++98中的特性,2011年,新C++標(biāo)準(zhǔn),C++11發(fā)布,增添了新特性,同時(shí)兼容C99中的特性。
??所以C與C++的最大區(qū)別在于它們的用于解決問(wèn)題的思想方法不一樣。之所以說(shuō)C++比C更先進(jìn),是因?yàn)椤霸O(shè)計(jì)這個(gè)概念已經(jīng)被融入到C++之中”。
??1951年,IBM的Jhon Backus(Fortran開(kāi)發(fā)小組組長(zhǎng))基于匯編語(yǔ)言著手研發(fā)Fortran語(yǔ)言。 ??1960年,圖靈獎(jiǎng)獲得者Alan J.Perlis在巴黎舉行的有全世界一流軟件專家參加的討論會(huì)上,發(fā)表了”算法語(yǔ)言Algol 60報(bào)告”,確定了程序設(shè)計(jì)語(yǔ)言Algol 60。Algol60語(yǔ)言的第一個(gè)編譯器由Edsger W. Dijkstra來(lái)實(shí)現(xiàn)。1962年,Alan J.Perlis又對(duì)Algol 60進(jìn)行了修正。Algo60語(yǔ)言,是從Fortran演化的一個(gè)標(biāo)準(zhǔn),目的是標(biāo)準(zhǔn)化一種數(shù)值計(jì)算語(yǔ)言。 ??1963年,劍橋大學(xué)將ALGOL 60語(yǔ)言發(fā)展成為CPL語(yǔ)言(Combined PRogramming Language)。 ??1967年,劍橋大學(xué)的Matin Richards對(duì)CPL語(yǔ)言進(jìn)行了簡(jiǎn)化,于是產(chǎn)生了BCPL語(yǔ)言。 ??1970年,美國(guó)貝爾實(shí)驗(yàn)室的Ken Thompson將BCPL進(jìn)行了修改,并為它起了一個(gè)有趣的名字“B語(yǔ)言”(最初是為Unix設(shè)計(jì)的)。并且他用B語(yǔ)言寫了第一個(gè)UNIX操作系統(tǒng)(第二版)。 ??1973年,美國(guó)貝爾實(shí)驗(yàn)室的D.M. Ritchie在B語(yǔ)言的基礎(chǔ)上最終設(shè)計(jì)出了一種新的語(yǔ)言,他取了BCPL的第二個(gè)字母作為這種語(yǔ)言的名字,這就是C語(yǔ)言。此后,其用C語(yǔ)言對(duì)Unix進(jìn)行了重寫(第三版)。
??最初,C語(yǔ)言沒(méi)有官方標(biāo)準(zhǔn)。1978年Brian W.Kernighian和Dennis M.Ritchie出版了名著《The C Programming Language》,從而使C語(yǔ)言成為目前世界上流行最廣泛的高級(jí)程序設(shè)計(jì)語(yǔ)言。而這本書附錄中的C Referrence Manual成為了事實(shí)上的C語(yǔ)言標(biāo)準(zhǔn),被人們稱為K&R C或者Classic C。但是,該附錄中只定義了C語(yǔ)言,卻沒(méi)有定義C庫(kù)。由于C的出現(xiàn)離不開(kāi)Unix,因此,Unix上實(shí)現(xiàn)的庫(kù)成為了一個(gè)C語(yǔ)言事實(shí)上的標(biāo)準(zhǔn)庫(kù)。 ??隨著C語(yǔ)言的日益流行,美國(guó)國(guó)家標(biāo)準(zhǔn)化組織(ANSI)在1983年成立了一個(gè)委員會(huì)(X3J11),以制定C語(yǔ)言標(biāo)準(zhǔn)。該標(biāo)準(zhǔn)于1989年正式被批準(zhǔn)采用。它就是ANSI C標(biāo)準(zhǔn)。該標(biāo)準(zhǔn)定義了C語(yǔ)言標(biāo)準(zhǔn)和C的標(biāo)準(zhǔn)庫(kù)。1990年,國(guó)際標(biāo)準(zhǔn)化組織(ISO)也要制定了一個(gè)C標(biāo)準(zhǔn),以使C語(yǔ)言在國(guó)際上統(tǒng)一標(biāo)準(zhǔn),方便使用,他們直接采用了ANSI C標(biāo)準(zhǔn),發(fā)布了標(biāo)準(zhǔn)文件:ISO/IEC 9899-1990 Programming languages – C。最終第一版的C標(biāo)準(zhǔn)被稱為C98或C90。算是C語(yǔ)言的第一個(gè)官方標(biāo)準(zhǔn)。由于ANSI C出現(xiàn)較早,該標(biāo)準(zhǔn)也稱為 ANSI C。 ??1994年,ISO 對(duì)C語(yǔ)言標(biāo)準(zhǔn)的修訂工作正式開(kāi)始。1999年12月1日,國(guó)際標(biāo)準(zhǔn)化組織(ISO)和國(guó)際電工委員會(huì)(IEC)旗下的C語(yǔ)言標(biāo)準(zhǔn)委員會(huì)(ISO/IEC JTC1/SC22/WG14)正式發(fā)布了標(biāo)準(zhǔn)文件: ISO/IEC 9899:1999 - Programming languages – C。這就是大家熟知的C99標(biāo)準(zhǔn)。這成為了C語(yǔ)言的第二個(gè)官方標(biāo)準(zhǔn)。 ??C99的修訂為C語(yǔ)言引入了大量新的特性,其借鑒了C++98標(biāo)準(zhǔn)一些特性。然而,如今不是所有C的編譯器都支持C99標(biāo)準(zhǔn),而完全或幾乎完全支持C99標(biāo)準(zhǔn)的主流編譯器有:GCC、Clang、Intel C++ Compiler等。另外,Visual Studio2013也部分支持了C99語(yǔ)法特征。 ??C99標(biāo)準(zhǔn)之后,新的C語(yǔ)言標(biāo)準(zhǔn)是國(guó)際標(biāo)準(zhǔn)化組織(ISO)和國(guó)際電工委員會(huì)(IEC)在2011年12月8日正式發(fā)布的C11標(biāo)準(zhǔn),官方正式名為ISO/IEC 9899:2011
??C標(biāo)準(zhǔn)由ISO和IEC旗下的C語(yǔ)言標(biāo)準(zhǔn)委員會(huì)(ISO/IEC JTC1/SC22/WG14)編寫,在其官方網(wǎng)站(http://www.open-std.org/)上可以找到標(biāo)準(zhǔn)的草稿,草稿是免費(fèi)的!
struct {int a[3], b;} hehe[] = { [0].a = {1}, [1].a = 2 }; struct {int a, b, c, d;} hehe = { .a = 1, .c = 3, 4, .b = 5} // 3,4 是對(duì) .c,.d 賦值的字符串里面,/u 支持 unicode 的字符支持 16 進(jìn)制的浮點(diǎn)數(shù)的描述所以 printf scanf 的格式化串多支持了 ll / LL對(duì)應(yīng)新的 long long 類型。浮點(diǎn)數(shù)的內(nèi)部數(shù)據(jù)描述支持了新標(biāo)準(zhǔn),這個(gè)可以用 #pragma 編譯器指定除了已經(jīng)有的 line file 以外,又支持了一個(gè) func 可以得到當(dāng)前的函數(shù)名對(duì)于非常數(shù)的表達(dá)式,也允許編譯器做化簡(jiǎn)修改了對(duì)于 / % 處理負(fù)數(shù)上的定義,比如老的標(biāo)準(zhǔn)里 -22 / 7 = -3, -22 % 7 = -1 而現(xiàn)在 -22 / 7 = -4, -22 % 7 = 6取消了不寫函數(shù)返回類型默認(rèn)就是 int 的規(guī)定允許 struct 定義的最后一個(gè)數(shù)組寫做 [] 不指定其長(zhǎng)度描述const const int i; 將被當(dāng)作 const int i; 處理增加和修改了一些標(biāo)準(zhǔn)頭文件。輸入輸出對(duì)寬字符還有長(zhǎng)整數(shù)等做了相應(yīng)的支持??關(guān)鍵字restrict只用于限定指針;該關(guān)鍵字用于告知編譯器,所有修改該指針?biāo)赶騼?nèi)容的操作全部都是基于(base on)該指針的,即不存在其它進(jìn)行修改操作的途徑;這樣的后果是幫助編譯器進(jìn)行更好的代碼優(yōu)化,生成更有效率的匯編代碼。restrict指針指針主要用做函數(shù)變?cè)?,或者指向由malloc()函數(shù)所分配的內(nèi)存變量。restrict數(shù)據(jù)類型不改變程序的語(yǔ)義。 ??如果某個(gè)函數(shù)定義了兩個(gè)restrict指針變?cè)?,編譯程序就假定它們指向兩個(gè)不同的對(duì)象,memcpy()函數(shù)就是restrict指針的一個(gè)典型應(yīng)用示例。 ??C89中memcpy()函數(shù)原型如下: void *memcpy (void *s1, const void *s2, size_t size); ??如果s1和s2所指向的對(duì)象重疊,其操作就是未定義的。memcpy()函數(shù)只能用于不重疊的對(duì)象。 ??C99中memcpy()函數(shù)原型如下: void *memcpy(void *restrict s1, const void *restrict s2,size_t size); ??通過(guò)使用restrict修飾s1和s2 變?cè)?,可確保它們?cè)谠撛椭兄赶虿煌膶?duì)象。 ??但要注意:restrict是C99中新增的關(guān)鍵字,在C89和C++中都不支持,在gcc中可以通過(guò)-std=c99來(lái)得到對(duì)它的支持。
??內(nèi)聯(lián)函數(shù)除了保持結(jié)構(gòu)化和函數(shù)式的定義方式外,還能使程序員寫出高效率的代碼。函數(shù)的每次調(diào)用與返回都會(huì)消耗相當(dāng)大的系統(tǒng)資源,尤其是當(dāng)函數(shù)調(diào)用發(fā)生在重復(fù)次數(shù)很多的循環(huán)語(yǔ)句中時(shí)。一般情況下,當(dāng)發(fā)生一次函數(shù)調(diào)用時(shí),變?cè)枰M(jìn)棧,各種寄存器內(nèi)存需要保存。當(dāng)函數(shù)返回時(shí),寄存器的內(nèi)容需要恢復(fù)。如果該函數(shù)在代碼內(nèi)進(jìn)行聯(lián)機(jī)擴(kuò)展,當(dāng)代碼執(zhí)行時(shí),這些保存和恢復(fù)操作旅游活動(dòng)會(huì)再發(fā)生,而且函數(shù)調(diào)用的執(zhí)行速度也會(huì)大大加快。函數(shù)的聯(lián)機(jī)擴(kuò)展會(huì)產(chǎn)生較長(zhǎng)的代碼,所以只應(yīng)該內(nèi)聯(lián)對(duì)應(yīng)用程序性能有顯著影響的函數(shù)以及長(zhǎng)度較短的函數(shù)
??值是0或1。C99中增加了用來(lái)定義bool、true以及false宏的頭文件
??C99標(biāo)準(zhǔn)中定義的復(fù)數(shù)類型如下:
float_Complex; float_Imaginary; double_Complex; double_Imaginary; long double_Complex; long double_Imaginary;??
??C99標(biāo)準(zhǔn)中引進(jìn)了long long int(-(2e63 - 1)至2e63 - 1)和unsigned long long int(0 - 2e64 - 1)。long long int能夠支持的整數(shù)長(zhǎng)度為64位。對(duì)應(yīng)的常量后綴是ll/ull/LL/ULL;格式化輸入輸出為%lld,%llu,%llx……
??C99中,程序員聲明數(shù)組時(shí),數(shù)組的維數(shù)可以由任一有效的整型表達(dá)式確定,包括只在運(yùn)行時(shí)才能確定其值的表達(dá)式,這類數(shù)組就叫做可變長(zhǎng)數(shù)組,但是只有局部數(shù)組才可以是變長(zhǎng)的。 ??可變長(zhǎng)數(shù)組的維數(shù)在數(shù)組生存期內(nèi)是不變的,也就是說(shuō),可變長(zhǎng)數(shù)組不是動(dòng)態(tài)的??梢宰兓闹皇菙?shù)組的大小。
void func(int n){ int vla[n]; printf("int vla[n] = %d/n", sizeof(vla));}變長(zhǎng)數(shù)組有一些限制:變長(zhǎng)數(shù)組必須是自動(dòng)存儲(chǔ)類的,意味著它們必須在函數(shù)內(nèi)部或作為函數(shù)參數(shù)聲明,而且聲明時(shí)不可以進(jìn)行初始化。C99標(biāo)準(zhǔn)規(guī)定,可以省略函數(shù)原型中的名稱,但是如果省略名稱,則需要用星號(hào)來(lái)代替省略的維數(shù):int sum2d(int , int, int ar[*][*]); // 只能用在函數(shù)聲明中??在C99中,如果需要使用數(shù)組作為函數(shù)變?cè)?,可以在?shù)組聲明的方括號(hào)內(nèi)使用static關(guān)鍵字,這相當(dāng)于告訴編譯程序,變?cè)赶虻臄?shù)組將至少包含指定的元素個(gè)數(shù)。也可以在數(shù)組聲明的方括號(hào)內(nèi)使用restrict,volatile,const關(guān)鍵字,但只用于函數(shù)變?cè)?。如果使用restrict,指針是初始訪問(wèn)該對(duì)象的惟一途徑。如果使用const,指針始終指向同一個(gè)數(shù)組。使用volatile沒(méi)有任何意義。(類型限定詞和static關(guān)鍵字只能用于具有數(shù)組類型的函數(shù)形參的第一維中)。由于形參中的VLA被自動(dòng)調(diào)整為等效的指針,因此這些類型限定詞實(shí)際上限定的是一個(gè)指針,例如:
??// 行注釋也是從C++過(guò)來(lái)的東西。引入了單行注釋標(biāo)記 “//” , 可以象C++一樣使用這種注釋了。//注釋另外一個(gè)最大的好處還是在于排版方便。 ??/* / 注釋是不支持嵌套的,所以只要里頭出現(xiàn)一個(gè)/就會(huì)導(dǎo)致注釋結(jié)束。不過(guò)這樣也帶來(lái)了一個(gè)有點(diǎn)可怕的陷阱,比如原來(lái)用/* */注釋的宏:
#define macro(arg1, arg2) / func(arg1, /* xxxxxxx */ / arg2 /* xxxxxxx */ / )你要是改成這樣:
#define macro(arg1, arg2) / func(arg1, // xxxxxxx / arg2 // xxxxxxx / )這就杯具了~~因?yàn)檫@樣等價(jià)于:
#define macro(arg1, arg2) func(arg1, // xxxxxxx arg2 // xxxxxxx )arg2就落入第一個(gè)//的魔掌,變成注釋了~~ ??總得來(lái)說(shuō),用//寫注釋肯定是比較方便的。只要能保證別在一個(gè)文件里面一會(huì)兒用/* */做行注釋,一會(huì)兒用//做行注釋就行了。 建議所有的單行注釋都可以用//搞。而文檔化注釋(函數(shù)頭部、文件頭部或者重要數(shù)據(jù)結(jié)構(gòu)頭部的那些注釋),還是建議用正統(tǒng)的格式來(lái)寫:
/** * xxxxxxx * xxxxxxx */另外最好別用//來(lái)壘多行注釋。
??解除了原先必須在block的第一條語(yǔ)句之前聲明變量的限制:現(xiàn)在C99也和C++一樣,可以在代碼中隨時(shí)聲明變量了。
#include <stdio.h>int main(void){ int num1 = 3; int num1 = 3; printf("%d/n", num1); int num2 = 10; // 變量定義 printf("%d/n", num2); return(0);}??其實(shí)混合聲明對(duì)于編碼的重要意義在于它對(duì)提高代碼的可讀性方面幫助很大。在C89里面,稍微復(fù)雜一點(diǎn)的函數(shù)中通常會(huì)看到這樣的壯觀景象:
int load_elf_file(const char *filename, int argc, int argv, int *retcode){ int elf_exec_fileno; int i, retval; uint k, elf_bss, elf_brk, elf_entry; uint start_code, end_code, end_data; struct elf_phdr *elf_ppnt, *elf_phdata; struct elfhdr elf_ex; struct file *file; ...;}??這個(gè)就是C89必須在Block第一條語(yǔ)句之前聲明變量帶來(lái)的后果,不管一個(gè)變量是否一直到Block的最后一行才被用到,你也不得不在一開(kāi)始就聲明它。
??宏可以帶變?cè)?,在宏定義中用省略號(hào)(…)表示。內(nèi)部預(yù)處理標(biāo)識(shí)符VA_ARGS決定變?cè)獙⒃诤翁幍玫教鎿Q。變參宏的最大好處是可以讓你很容易地用宏來(lái)封裝一些帶變參的函數(shù)(主要是打印函數(shù)) 如可以這樣寫一個(gè)輸出到stderr的宏:
#define print_err(...) fprintf(stderr, __VA_ARGS__) // 宏參數(shù)里面“...”的部份會(huì)展開(kāi)到__VA_ARGS__處。??如果在VA_ARGS前面加上##,就可以寫出允許變參部份為空的變參宏。比如我自己常用的調(diào)試信息打印宏:
#define debug(fmt, ...) / printf("[DEBUG] %s:%d <%s>: " fmt, / __FILE__, __LINE__, __func__, ##__VA_ARGS__)??##VA_ARGS表示變參“…”部份允許為空。當(dāng)變參部份為空時(shí)VA_ARGS會(huì)展開(kāi)成空字符串,并且##前面那個(gè)逗號(hào)也會(huì)在展開(kāi)時(shí)去掉。于是你可以這樣調(diào)用這個(gè)宏:debug(“Hello”); 
??C99引入了在程序中定義編譯指令的另外一種方法:_Pragma運(yùn)算符。格式如下: _Pragma("directive") ??其中directive是要滿打滿算的編譯指令。_Pragma運(yùn)算符允許編譯指令參與宏替換。 ??如果字符串文字具有L前綴,則刪除該前綴。 ??刪除前導(dǎo)和結(jié)尾雙引號(hào)。 ??用雙引號(hào)替換每個(gè)換碼序列’。 ??用單個(gè)反斜杠替換每個(gè)換碼序列/
STDC FP_CONTRACT ON/OFF/DEFAULT 若為ON,浮點(diǎn)表達(dá)式被當(dāng)做基于硬件方式處理的獨(dú)立單元。默認(rèn)值是定義的工具。 STDC FEVN_access ON/OFF/DEFAULT 告訴編譯程序可以訪問(wèn)浮點(diǎn)環(huán)境。默認(rèn)值是定義的工具。 STDC CX_LIMITED_RANGE ON/OFF/DEFAULT 若值為ON,相當(dāng)于告訴編譯程序某程序某些含有復(fù)數(shù)的公式是可靠的。默認(rèn)是OFF。
STDC_HOSTED 若操作系統(tǒng)存在,則為1 STDC_VERSION 199991L或更高。代表C的版本 STDC_IEC_599 若支持IEC 60559浮點(diǎn)運(yùn)算,則為1 STDC_IEC_599_COMPLEX 若支持IEC 60599復(fù)數(shù)運(yùn)算,則為1 STDC_ISO_10646 由編譯程序支持,用于說(shuō)明ISO/IEC 10646標(biāo)準(zhǔn)的年和月格式:yyymmmL
??C99中,程序員可以在for語(yǔ)句的初始化部分定義一個(gè)或多個(gè)變量,這些變量的作用域僅于本for語(yǔ)句所控制的循環(huán)體內(nèi)。在C89中,這樣是不可以的,具體可以在VC6中驗(yàn)證(VC6支持到C89)。for循環(huán)的初始化語(yǔ)句中聲明的任何變量的作用域是整個(gè)循環(huán)(包括控制和迭代表達(dá)式)。 如下:
for (int i=0; i<10; i++){ //loop body};??C99復(fù)合賦值中,可以指定對(duì)象類型的數(shù)組、結(jié)構(gòu)或聯(lián)合表達(dá)式。當(dāng)使用復(fù)合賦值時(shí),應(yīng)在括弧內(nèi)指定類型,后跟由花括號(hào)圍起來(lái)的初始化列表;若類型為數(shù)組,則不能指定數(shù)組的大小。建成的對(duì)象是未命名的。 例: double *fp = (double[]) {1.1, 2.2, 3.3}; ??該語(yǔ)句用于建立一個(gè)指向double的指針fp,且該指針指向這個(gè)3元素?cái)?shù)組的第一個(gè)元素。 在文件域內(nèi)建立的復(fù)合賦值只在程序的整個(gè)生存期內(nèi)有效。在模塊內(nèi)建立的復(fù)合賦值是局部對(duì)象,在退出模塊后不再存在。
??C99具有一個(gè)稱為伸縮型數(shù)組成員(flexible array member)的新特性。結(jié)構(gòu)中的最后一個(gè)元素允許是未知大小的數(shù)組,這就叫做柔性數(shù)組成員。利用這一新特性可以聲明最后一個(gè)成員是一個(gè)具有特殊屬性的數(shù)組的結(jié)構(gòu)體。該數(shù)組成員的特殊屬性之一是它不立即存在。第二個(gè)特殊屬性是您可以編寫適當(dāng)?shù)拇a使用這個(gè)伸縮型數(shù)組成員,就像它確實(shí)存在并且擁有您需要的任何數(shù)目的元素一樣。柔性數(shù)組成員在做變長(zhǎng)的報(bào)文或字符串處理時(shí)極為好用,也是一個(gè)幾乎所有的C碼農(nóng)都應(yīng)該掌握的技巧。 聲明一個(gè)伸縮型數(shù)組成員的規(guī)則: - 伸縮型數(shù)組成員必須是最后一個(gè)數(shù)組成員。 - 結(jié)構(gòu)中必須至少有一個(gè)其他成員。 - 伸縮型數(shù)組就像普通數(shù)組一樣被聲明,但是它的方括號(hào)是空的。 比如:
typedef struct { int count; char Word[]; // 只能放在末尾,等價(jià)于gcc的char word[0]} word_counter_t;注意:
sizeof返回的這種結(jié)構(gòu)大小不包括柔性數(shù)組的內(nèi)存直接聲明帶有伸縮數(shù)組成員結(jié)構(gòu)體的變量沒(méi)有任何意義,因?yàn)樯炜s數(shù)組沒(méi)有內(nèi)存,例如:word_counter_t wd; // 這里變量wd中沒(méi)有word包含柔性數(shù)組成員的結(jié)構(gòu)用malloc()函數(shù)進(jìn)行內(nèi)存的動(dòng)態(tài)分配,并且分配的內(nèi)存應(yīng)該大于結(jié)構(gòu)的大小,以適應(yīng)柔性數(shù)組的預(yù)期大小。當(dāng)給其指針動(dòng)態(tài)分配內(nèi)存空間時(shí),多余的空間會(huì)分配給scores數(shù)組??C99中,該特性對(duì)經(jīng)常使用稀疏數(shù)組的程序員十分有用。簡(jiǎn)單來(lái)說(shuō),就是在初始化結(jié)構(gòu)體和數(shù)組時(shí),可以通過(guò)指定具體成員名或數(shù)組下標(biāo)來(lái)賦初值。 用于數(shù)組的格式: [index] = vol; // 其中,index表示數(shù)組的下標(biāo),vol表示本數(shù)組元素的初始化值。 例如: int x[10] = {[0] = 10, [5] = 30}; 其中只有x[0]和x[5]得到了初始化 用于結(jié)構(gòu)或聯(lián)合的格式如下: .成員名 = vol; // 其中, vol表示本數(shù)組元素的初始化值。 例如: struct example{ int k, m, n; } object = {.m = 10, .n = 200}; 注意:該方法只能用在定義時(shí)初始化,不能再后續(xù)使用 
??C99中printf()和scanf()函數(shù)系列引進(jìn)了處理long long int和unsigned long long int數(shù)據(jù)類型的特性。long long int 類型的格式修飾符是ll。在printf()和scanf()函數(shù)中,ll適用于d, i, o, u 和x格式說(shuō)明符。另外,C99還引進(jìn)了hh修飾符。當(dāng)使用d, i, o, u和x格式說(shuō)明符時(shí),hh用于指定char型變?cè)l和hh修飾符均可以用于n說(shuō)明符。 ??格式修飾符a和A用在printf()函數(shù)中時(shí),結(jié)果將會(huì)輸出十六進(jìn)制的浮點(diǎn)數(shù)。格式如下:[-]0xh, hhhhp + d 使用A格式修飾符時(shí),x和p必須是大寫。A和a格式修飾符也可以用在scanf()函數(shù)中,用于讀取浮點(diǎn)數(shù)。調(diào)用printf()函數(shù)時(shí),允許在%f說(shuō)明符前加上l修飾符,即%lf,但不起作用。
C89中標(biāo)準(zhǔn)的頭文件
<assert.h> 定義宏assert()<ctype.h> 字符處理<errno.h> 錯(cuò)誤報(bào)告<float.h> 定義與實(shí)現(xiàn)相關(guān)的浮點(diǎn)值<limits.h> 定義與實(shí)現(xiàn)相關(guān)的各種極限值<locale.h> 支持函數(shù)setlocale()<locale.h> 數(shù)學(xué)函數(shù)庫(kù)使用的各種定義<setjmp.h> 支持非局部跳轉(zhuǎn)<signal.h> 定義信號(hào)值<stdarg.h> 支持可變長(zhǎng)度的變?cè)斜?lt;stddef.h> 定義常用常數(shù)<stdio.h> 支持文件輸入和輸出<stdlib.h> 其他各種聲明<string.h> 支持串函數(shù)<time.h> 支持系統(tǒng)時(shí)間函數(shù)C99新增的頭文件和庫(kù)
<complex.h> 支持復(fù)數(shù)算法<fenv.h> 給出對(duì)浮點(diǎn)狀態(tài)標(biāo)記和浮點(diǎn)環(huán)境的其他方面的訪問(wèn)<inttypes.h> 定義標(biāo)準(zhǔn)的、可移植的整型類型集合。也支持處理最大寬度整數(shù)的函數(shù)<iso646.h> 在1995年第一次修訂時(shí)首次引進(jìn),用于定義對(duì)應(yīng)各種運(yùn)算符的宏<stdbool.h> 支持布爾數(shù)據(jù)類型類型。定義宏bool,以便兼容于C++<stdint.h> 定義標(biāo)準(zhǔn)的、可移植的整型類型集合。該文件包含在<inttypes.h>中<tgmath.h> 定義一般類型的浮點(diǎn)宏<wchar.h> 在1995年第一次修訂時(shí)首次引進(jìn),用于支持多字節(jié)和寬字節(jié)函數(shù)<wctype.h> 在1995年第一次修訂時(shí)首次引進(jìn),用于支持多字節(jié)和寬字節(jié)分類函數(shù)??用于指出func所存放的函數(shù)名,類似于字符串賦值。
??C99中,如果同一類型限定符在同一說(shuō)明符限定符列表中出現(xiàn)多次(無(wú)論直接出現(xiàn)還是通過(guò)一個(gè)或多個(gè)typedef),行為與該類型限定符僅出現(xiàn)一次時(shí)相同。 ??在C90中,以下代碼會(huì)導(dǎo)致錯(cuò)誤:
const const int a; int main(void){ return(0);}但是,對(duì)于C99,C編譯器接受多個(gè)限定符。
??現(xiàn)在,關(guān)鍵字static可以出現(xiàn)在函數(shù)聲明符中及參數(shù)的數(shù)組聲明符中,表示編譯器至少可以假定許多元素將傳遞到所聲明的函數(shù)中。使優(yōu)化器能夠作出以其他方式無(wú)法確定的假定。
C編譯器將數(shù)組參數(shù)調(diào)整為指針,因此void foo(int a[]) 與void foo(int *a) 相同。 如果您指定void foo(int * restrict a); 等類型限定符,則C 編譯器使用實(shí)質(zhì)上與聲明限定指針相同的數(shù)組語(yǔ)法void foo(int a[restrict]); 表示它。 C編譯器還使用static限定符保留關(guān)于數(shù)組大小的信息。例如,如果您指定void foo(int a[10]),則編譯器仍將它表達(dá)為void foo(int *a)。按以下所示使用static限定符:void foo(int a[static 10]),讓編譯器知道指針a不是NULL,并且使用它可訪問(wèn)至少包含十個(gè)元素的整數(shù)數(shù)組。1.放寬的轉(zhuǎn)換限制
| 限制 | C89標(biāo)準(zhǔn) | C99標(biāo)準(zhǔn) |
|---|---|---|
| 數(shù)據(jù)塊的嵌套層數(shù) | 15 | 127 |
| 條件語(yǔ)句的嵌套層數(shù) | 8 | 63 |
| 內(nèi)部標(biāo)識(shí)符中的有效字符個(gè)數(shù) | 31 | 63 |
| 外部標(biāo)識(shí)符中的有效字符個(gè)數(shù) | 6 | 31 |
| 結(jié)構(gòu)或聯(lián)合中的成員個(gè)數(shù) | 127 | 1023 |
| 函數(shù)調(diào)用中的參數(shù)個(gè)數(shù) | 31 | 127 |
2. 不再支持隱含式的int規(guī)則 每個(gè)聲明中的聲明說(shuō)明符中應(yīng)至少指定一個(gè)類型說(shuō)明符,現(xiàn)在不支持沒(méi)有類型就默認(rèn)是int的聲明語(yǔ)句。比如在C89中, auto i = 0;是合法的 3. 刪除了隱含式函數(shù)聲明 4. 對(duì)返回值的約束。C99中,非空類型函數(shù)必須使用帶返回值的return語(yǔ)句 5. 擴(kuò)展的整數(shù)類型
| 擴(kuò)展類型 | 含義 |
|---|---|
| int16_t | 整數(shù)長(zhǎng)度為精確16位 |
| int_least16_t | 整數(shù)長(zhǎng)度為至少16位 |
| int_fast32_t | 最穩(wěn)固的整數(shù)類型,其長(zhǎng)度為至少32位 |
| intmax_t | 最大整數(shù)類型 |
| uintmax_t | 最大無(wú)符號(hào)整數(shù)類型 |
6. 對(duì)整數(shù)類型提升規(guī)則的改進(jìn)。C89中,表達(dá)式中類型為char,short int或int的值可以提升為int或unsigned int類型。 7. C99中,每種整數(shù)類型都有一個(gè)級(jí)別。例如:long long int 的級(jí)別高于int, int的級(jí)別高于char等。在表達(dá)式中,其級(jí)別低于int或unsigned int的任何整數(shù)類型均可被替換成int或unsigned int類型。 ??但是各個(gè)公司對(duì)C99的支持所表現(xiàn)出來(lái)的興趣不同。當(dāng)GCC和其它一些商業(yè)編譯器支持C99的大部分特性的時(shí)候,微軟和Borland卻似乎對(duì)此不感興趣。
??1967 年,Simula語(yǔ)言中第一次出現(xiàn)了面向?qū)ο?(OO) 的概念,但由于當(dāng)時(shí)軟件規(guī)模還不大,技術(shù)也還不太成熟,面向?qū)ο蟮膬?yōu)勢(shì)并未發(fā)揮出來(lái)。1980年,Smalltalk-80出現(xiàn)后,面向?qū)ο蠹夹g(shù)才開(kāi)始發(fā)揮魅力。 ??1979 年,Bjarne Stroustrup 借鑒 Simula中”Class” 的概念,開(kāi)始著手“C with Classes”的研發(fā)工作,“C with Classes”表明這種新語(yǔ)言是在C基礎(chǔ)上研發(fā)的,是C語(yǔ)言的超集。新語(yǔ)言的初始版本除了包括C語(yǔ)言的基本特征之外,還具備類、簡(jiǎn)單繼承、內(nèi)聯(lián)機(jī)制、函數(shù)默認(rèn)參數(shù)以及強(qiáng)類型檢查等特性。Bjarne Stroustrup的第一款“C with classes”編譯器叫Cfront(由“C with Classes”編寫),這個(gè)名字源自一個(gè)叫做Cpre的C編譯器。Cfront的機(jī)理是把“C with classes”的代碼翻譯成原生C代碼。 ??1983年,“C with Classes”語(yǔ)言更名為C++。C語(yǔ)言中“++”運(yùn)算子的作用是對(duì)一個(gè)變量進(jìn)行遞增操作,由此我們多少可以知曉Stroustrup對(duì)這種新語(yǔ)言的定位。這個(gè)時(shí)期,許多重要的特性被加入,其中包括虛函數(shù)、函數(shù)重載、引用機(jī)制(符號(hào)為&)、const關(guān)鍵字以及雙斜線的單行注釋(從BCPL語(yǔ)言引入)。 ??1986 年,B.Stroustrup 出版了《The C++ Programming Language》第一版,這時(shí) C++ 已經(jīng)開(kāi)始受到關(guān)注,B.Stroustrup 被稱為 C++之父(Creator of C++)。 ??1989 年,負(fù)責(zé) C++ 標(biāo)準(zhǔn)化的 ANSI X3J16掛牌成立。1989年,C++再次版本更新,這次更新引入了多重繼承、保護(hù)成員以及靜態(tài)成員等語(yǔ)言特性。 ??1990 年,B.Stroustrup 出版了《The Annotated C++ Reference Manual》(簡(jiǎn)稱 ARM),由于當(dāng)時(shí)還沒(méi)有 C++ 標(biāo)準(zhǔn),ARM 成了事實(shí)上的標(biāo)準(zhǔn)。1990 年,Template(模板) 和 Exception(異常) 加入到了 C++ 中,使 C++ 具備了泛型編程(Generic Programming)和更好的運(yùn)行期錯(cuò)誤處理方式。 ??1991 年,負(fù)責(zé) C++ 語(yǔ)言國(guó)際標(biāo)準(zhǔn)化的技術(shù)委員會(huì)工作組 ISO/IEC JTC1/SC22/WG21 召開(kāi)了第一次會(huì)議,開(kāi)始進(jìn)行 C++ 國(guó)際標(biāo)準(zhǔn)化的工作。從此,ANSI 和 ISO 的標(biāo)準(zhǔn)化工作保持同步,互相協(xié)調(diào)。1993 年,RTTI(運(yùn)行期類型識(shí)別)和Namespace(名字空間)加入到 C++ 中。1994年,C++ 標(biāo)準(zhǔn)草案出臺(tái)。 B.Stroustrup 出版了《The Design and Evolution of C++》(簡(jiǎn)稱 D&E)。本來(lái),C++ 標(biāo)準(zhǔn)已接近完工,這時(shí) STL(標(biāo)準(zhǔn)模板庫(kù)) 的建議草案被提交到標(biāo)準(zhǔn)委員會(huì),對(duì) STL 標(biāo)準(zhǔn)化的討論又一次推遲了 C++ 標(biāo)準(zhǔn)的出臺(tái)。 ??1998年,C++標(biāo)準(zhǔn)委員會(huì)發(fā)布了C++語(yǔ)言的第一個(gè)國(guó)際標(biāo)準(zhǔn)—ISO/IEC 14882:1998,該標(biāo)準(zhǔn)即為大名鼎鼎的C++98。C++98的提出,《The Annotated C++ Reference Manual》功不可沒(méi)。同時(shí),1979年開(kāi)始研發(fā)的標(biāo)準(zhǔn)模板庫(kù)(Standard Template Library,STL)也被納入了該版標(biāo)準(zhǔn)中。ANSI 和 ISO 終于先后批準(zhǔn) C++ 語(yǔ)言成為美國(guó)國(guó)家標(biāo)準(zhǔn)和國(guó)際標(biāo)準(zhǔn)。 ??2003年,標(biāo)準(zhǔn)委員會(huì)針對(duì)98版本中存在的諸多問(wèn)題進(jìn)行了修訂,并沒(méi)有增加新的特性,修訂后發(fā)布了C++03。 C++11,之前被稱作C++0x,即ISO/IEC 14882:2011,是目前的C++編程語(yǔ)言的第三版正式標(biāo)準(zhǔn)。它取代第二版標(biāo)準(zhǔn)ISO/IEC 14882:2003(第一版ISO/IEC 14882:1998發(fā)布于1998年,第二版于2003年發(fā)布,分別通稱C++98以及C++03,兩者差異很小)。新的標(biāo)準(zhǔn)包含了幾個(gè)核心語(yǔ)言增加的新特性,而且擴(kuò)展C++標(biāo)準(zhǔn)程序庫(kù),并入了大部分的C++ Technical Report 1程序庫(kù)(數(shù)學(xué)的特殊函數(shù)除外)。為了兼容C語(yǔ)言,C++11將對(duì)以下C99特性的支持也都納入了新標(biāo)準(zhǔn)中:
__func__預(yù)定義標(biāo)識(shí)符_Pragma 操作符不定參數(shù)宏定義以及__VA_ARGS__寬窄字符串連接long long類型略
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注