C语言
| C語言 | |
|---|---|
| 程序式 | |
|
发行时间
|
1972年 |
|
設計者
|
丹尼斯·里奇(Dennis Ritchie) |
|
實作者
|
丹尼斯·里奇(Dennis Ritchie)和肯·汤普逊(Ken Thompson) |
| 最新发行时间 | ISO/IEC 9899 2011(2011年11月) |
|
主要實作產品
|
Clang、GCC、MSVC、Turbo C、Watcom C |
|
啟發語言
|
B語言、組合語言 |
|
影響語言
|
awk, BitC, csh, C++, C#, Concurrent C, D, Java, JavaScript, Objective-C, Perl, PHP |
| 跨平台 | |
C語言,是一种通用的、程序式的程式語言,广泛用于系统与应用软件的开发。具有高效、灵活、功能丰富、表达力强和較高的可移植性等特点,在程序员中备受青睐。最近25年是使用最为广泛的编程语言[1]。
C语言是由UNIX的研制者丹尼斯·里奇於1970年由肯·汤普逊所研制出的B语言的基础上发展和完善起来的。目前,C语言編譯器普遍存在於各種不同的操作系统中,例如UNIX、MS-DOS、Microsoft Windows及Linux等。C語言的設計影響了許多後來的程式語言,例如C++、Objective-C、Java、C#等。
1980年代,為了避免各開發廠商用的C語言語法產生差異,由美國國家標準局為C語言訂定了一套完整的國際標準語法,稱為ANSI C,作為C語言的標準。1980年代至今的有关程式開發工具,一般都支持符合ANSI C的語法。
目录 |
設計哲學 [编辑]
C語言是一個程序語言,設計目標是提供一種能以簡易的方式編譯、處理低階記憶體、產生少量的機械碼以及不需要任何執行環境支援便能執行的程式語言。C語言也很適合搭配汇编语言來使用。儘管C語言提供了許多低階處理的功能,但仍然保持著良好跨平台的特性,以一個標準規格寫出的C語言程式可在許多電腦平台上進行編譯,甚至包含一些嵌入式处理器(微控制器或称MCU)以及超級電腦等作業平台。
特色 [编辑]
- C語言是一個有結構化程式設計、具有变量作用域(variable scope)以及遞迴功能的程序式語言。
- 傳遞參數是以值傳遞(Pass-by-value),也可以透過指针來傳遞参数(Pass-by-address)。
- 不同的變數類型可以用結構体(struct)組合在一起。
- 只有32個保留字(reserved keywords),使变量、函數命名有更多彈性。
- 部份的变量類型可以轉換,例如整型和字符型变量。
- 透過指针(pointer),C語言可以容易的對記憶體進行低階控制。
- 编译预处理(preprocessor)讓C語言的編譯更具有彈性。
歷史 [编辑]
早期發展 [编辑]
C語言最早是由丹尼斯·里奇為了在PDP-11電腦上運行的UNIX系統所設計出來的程式語言,第一次發展在1969年到1973年之間。之所以被稱為“C”是因為C語言的很多特性是由一種更早的被稱為B語言的程式語言中發展而來。早期作業系統的核心大多由組合語言組成,隨著C語言的發展,C語言已經可以用來編寫作業系統的核心。1973年,Unix作業系統的核心正式用C語言改寫,這是C語言第一次應用在作業系統的核心編寫上。
K&R C [编辑]
1978年,丹尼斯·里奇(Dennis Ritchie)和布萊恩·柯林漢合作出版了《C程序设计语言》的第一版。書中介紹的C語言標準也被C語言程式設計師稱作“K&R C”,第二版的書中也包含了一些ANSI C的標準。K&R C主要介绍了以下特色:
- 结构(struct)类型
- 长整数(long int)类型
- 无符号整数(unsigned int)类型
- 把运算符=+和=-改为+=和-=。因为=+和=-會使得編譯器不知道使用者要處理i = -10還是i =- 10,使得處理上產生混淆。
即使在後來ANSI C標準被提出的許多年後,K&R C仍然是許多編譯器的最低標準要求,許多老舊的編譯仍然運行K&R C的標準。
ANSI C 和 ISO C [编辑]
1989年,C语言被 ANSI 标准化(ANSI X3.159-1989)。标准化的一个目的是扩展K&R C。这个标准包括了一些新特性。在K&R出版後,一些新特性被非官方地加到C语言中。
- void 函数
- 函数返回 struct 或 union 类型
- void * 数据类型
在ANSI标准化自己的过程中,一些新的特性被加了进去。ANSI也规定了一套标准函数库。ANSI ISO(国际标准化组织)成立 ISO/IEC JTC1/SC22/WG14 工作组,来规定国际标准的C语言。通过对ANSI标准的少量修改,最终通过了 ISO 9899:1990。随后,ISO标准被 ANSI 采纳。
传统C语言到ANSI/ISO标准C语言的改进包括:
- 增加了真正的标准库
- 新的预处理命令与特性
- 函数原型允许在函数申明中指定参数类型
- 一些新的关键字,包括 const、volatile 与 signed
- 宽字符、宽字符串与多字节字符
- 对约定规则、声明和类型检查的许多小改动与澄清
WG14工作小组之後又於1994年,对1985年颁布的标准做了两处技术修订(缺陷修复)和一个补充(扩展)。下面是 1994 年做出的所有修改:
- 3 个新的标准库头文件 iso646.h、wctype.h 和 wchar.h
- 几个新的记号与预定义宏,用于对国际化提供更好的支持
- printf/sprintf 函数一系列新的格式代码
- 大量的函数和一些类型与常量,用于多字节字符和宽字节字符
C99 [编辑]
在ANSI的标准确立後,C语言的规范在一段时间内没有大的变动,然而C++在自己的标准化建立过程中继续发展壮大。《标准修正案一》在1994年为C语言建立了一个新标准,但是只修正了一些C89标准中的细节和增加更多更广的国际字符集支持。不过,这个标准引出了1999年ISO 9899:1999的发表。它通常被称为C99。C99被ANSI于2000年3月采用。
在C99中包括的特性有:
- 增加了对编译器的限制,比如源程序每行要求至少支持到 4095 字节,变量名函数名的要求支持到 63 字节(extern 要求支持到 31)。
- 增强了预处理功能。例如:
- 增加了新关键字 restrict, inline, _Complex, _Imaginary, _Bool
- 支持 long long, long double _Complex, float _Complex 等类型
- 支持不定长的数组,即数组长度可以在运行时决定,比如利用变量作为数组长度。声明时使用 int a[var] 的形式。不过考虑到效率和实现,不定长数组不能用在全局,或 struct 与 union 里。
- 变量声明不必放在语句块的开头,for 语句提倡写成 for(int i=0;i<100;++i) 的形式,即i 只在 for 语句块内部有效。
- 允许采用(type_name){xx,xx,xx} 类似于 C++ 的构造函数的形式构造匿名的结构体。
- 初始化结构的时候允许对特定的元素赋值,形式为:
-
struct test{int a[3],b;} foo[] = { [0].a = {1}, [1].a = 2 };
-
struct test{int a, b, c, d;} foo = { .a = 1, .c = 3, 4, .b = 5} // 3,4 是对 .c,.d 赋值的
-
- 格式化字符串中,利用 \u 支持 unicode 的字符。
- 支持 16 进制的浮点数的描述。
- printf scanf 的格式化串增加了对 long long int 类型的支持。
- 浮点数的内部数据描述支持了新标准,可以使用 #pragma 编译器指令指定。
- 除了已有的 __line__ __file__ 以外,增加了 __func__ 得到当前的函数名。
- 允许编译器化简非常数的表达式。
- 修改了 / % 处理负数时的定义,这样可以给出明确的结果,例如在C89中-22 / 7 = -3, -22 % 7 = -1,也可以-22 / 7= -4, -22 % 7 = 6。 而C99中明确为 -22 / 7 = -3, -22 % 7 = -1,只有一种结果。
- 取消了函数返回类型默认为 int 的规定。
- 允许 struct 定义的最后一个数组不指定其长度,写做 [](flexible array member)。
- const const int i 将被当作 const int i 处理。
- 增加和修改了一些标准头文件,比如定义 bool 的 <stdbool.h> ,定义一些标准长度的 int 的 <inttypes.h> ,定义复数的 <complex.h> ,定义宽字符的 <wctype.h> ,类似于泛型的数学函数 <tgmath.h>, 浮点数相关的 <fenv.h>。 在<stdarg.h> 增加了 va_copy 用于复制 ... 的参数。
进一步了解 [编辑]
C语言由函数和变量组成,C的函数就像是Fortran中的子程序和函数。
在C语言中,程序从main开始执行。main函数通过调用和控制其他函数进行工作。例如上面的printf。程序员可以自己写函数,或从库中调用函数。在上面的return 0;使得main返回一个值给调用程序的壳层,表明程序是否成功运行。
一个C语言的函数由返回值、函数名、参数列表和函数体组成。函数体的语法和其它的复合的语句部分是一样的。
复合语句 [编辑]
C语言中的复合语句(或称语句块)的格式为:
语句;
语句;
/* ... */
}
复合语句可以使得几个语句从文法上变成一个语句。
有时必须使用复合语句,否则会产生错误。例如,在运用循环语句的时候,如果循环体(即循环中执行部分)包含多个语句(以分号隔开),则必须使用花括号将他们合并成一个复合语句。如果不这么做,系统仅把第一个分号前的内容看做循环体。
需要注意的是,部分C编译器并不支持在任意位置使用复合语句。
條件語句 [编辑]
C語言有三種條件語句形式。兩種是if,另一種是switch。
兩種if包括:
語句;
以及
語句;
else
語句;
運算式的值非零表示條件為真;如果條件为假,程式將跳過if处的語句,直接執行if後面的語句。但是如果if後面有else,則當條件为假時,程式跳到else處執行。if和else後面的語句可以是另個if語句,這種套疊式的結構,允許更複雜的邏輯控制流程得以實現。在一般情況下,else一定與最接近的if成對,必要時可用括弧{}越過此限制。比較下面兩種情況:
if (運算式)
語句;
else
語句;
{
if(運算式)
語句;
}
else
語句;
switch通常用於對幾種有明確值的條件進行控制。它要求的條件值通常是整數或字元。與switch搭配的條件轉移是case。使用case後面的標值,控制程式將跳到滿足條件的case處一直往下執行,直到語句結束或遇到break。通常可以使用default把其他例外的情況包含進去。如果switch語句中的條件不成立,控制程式將跳到default處執行;如果省略default子句,則直接執行下一語句。switch是可以嵌套的。
{
case 值1:
語句;
break;
case 值2:
語句;
break;
default:
語句;
}
循環語句(迴圈) [编辑]
C語言有三種形式的循環語句:
語句
while(表達式);
while(表達式)
語句;
for(表達式1; 表達式2; 表達式3)
語句;
在while和do中,語句將執行到表達式的值為零時结束。在do...while語句中,循環將至少被執行一次。这三種循環結構可以互相轉化:
<語句>;
如果<語句>中不使用continue語句的话,相當於
while (<表達式2>) {
<語句>;
<表達式3>;
}
當循環條件一直為真時,將產生無窮迴圈。
跳轉語句 [编辑]
跳轉語句包括四種:goto,continue,break和return。
goto語句是無條件轉移語句:
標記必須在當前函數中定義,使用“標記:”的格式定義。程式將跳到標記處繼續執行。由於goto容易產生閱讀上的困難,所以應該儘量少用。
continue語句用在迴圈語句中,作用是結束當前一輪的迴圈,馬上開始下一輪迴圈。
break語句用在迴圈語句或switch中,作用是結束當前迴圈,跳到循環體外繼續執行。但是使用break只能跳出一層迴圈。在要跳出多重迴圈時,可以使用goto使得程式更為簡潔。
當一個函數執行結束後要返回一個值時,使用return。return可以跟一個運算式或變數。如果return後面沒有值,將執行不返回值。
在C語言中的运算符号 [编辑]
| ()、 []、 -> 、 .、 !、 ++、 -- | 圆括号、方括号、指標、成員、逻辑非、自加、自减 |
| ++ 、 -- 、 * 、 & 、 ~ 、 ! 、 + 、 - 、 sizeof、(cast) | 单目运算符 |
| * 、 / 、 % | 算术运算符 |
| + 、 - | 算术运算符 |
| << 、 >> | 位运算符 |
| < 、 <= 、 > 、 >= | 关系运算符 |
| == 、 != | 关系运算符号 |
| & | 位与 |
| ^ | 位异或 |
| | | 位或 |
| && | 逻辑与 |
| || | 逻辑或 |
| ? 、 : | 条件运算符 |
| = 、 += 、 -= 、 *= 、 /= 、 %= 、 &= 、 |= 、 ^= | 赋值运算符 |
| , | 顺序运算符 |
比較特別的是,位元右移(>>)運算子可以是算術(左端補最高有效位)或是邏輯(左端補 0)位移。例如,將 11100011 右移 3 位元,算術右移後成為 11111100,邏輯右移則為 00011100。因算術位元右移較適於處理帶負號整數,所以幾乎所有的編譯器都是算術位元右移。[3]
运算符的优先级从高到低大致是:单目运算符、算术运算符、关系运算符、逻辑运算符、条件运算符、赋值运算符(=)和逗号运算符。
数据类型 [编辑]
基础数据类型 [编辑]
注意:以下是典型的数据位长和范围。但是编译器可能使用不同的数据位长和范围。这取决于使用的编译器。请参考具体的参考手册。
在头文件<limits.h>和<float.h>中说明了基础数据的长度。float,double和long double的范围就是在IEEE 754标准中提及的典型数据。
| 关键字 | 位长(字节) | 范围 | 格式化字符串 |
|---|---|---|---|
char |
1 | -128..127(或0..255,与体系结构相关) | %c |
unsigned char |
1 | 0..255 | |
signed char |
1 | -128..127 | |
int |
2(16位系统) 或 4 |
-32768..32767 或 -2147483648..2147483647 |
%i, %d |
unsigned int |
2 或 4 |
0..65535 或 0..4294967295 |
%u |
signed int |
2 或 4 |
-32768..32767 或 -2147483648..2147483647 |
%i, %d |
short int |
2 | -32768..32767 | %hi |
unsigned short |
2 | 0..65535 | %hu |
signed short |
2 | -32768..32767 | |
long int |
4 或 8[4] |
-2147483648..2147483647 或 -9223372036854775808..9223372036854775807 |
%li, %ld |
unsigned long |
4 或 8 |
0..4294967295 或 0..18446744073709551615 |
%lu |
signed long |
4 或 8 |
-2147483648..2147483647 或 -9223372036854775808..9223372036854775807 |
|
long long |
8 | -9223372036854775808..9223372036854775807 | %lli |
unsigned long long |
8 | 0..18446744073709551615 | %llu |
float |
4 | 3.4x10−38..3.4x10+38 (7 sf) | %f, %e, %g |
double |
8 | 1.7x10−308..1.7x10+308 (15 sf) | %f, %e, %g |
long double |
8 或以上 | 編譯器相關 | %Lf, %Le, %Lg |
陣列 [编辑]
如果一個變數名後面跟著一個有數字的中括弧,這個聲明就是陣列聲明。字串也是一種陣列,它們以ASCII的NUL作為陣列的結束。要特別注意的是,方括內的索引值是從0算起的。
例如:
char mystring [80];
float mymatrix [3] [2] = {2.0 , 10.0, 20.0, 123.0, 1.0, 1.0};
int notfull [3][3] = {{1},{1,2,3},{4,5}}; (*)
char lexicon [10000] [300];/* 共一萬個最大長度為300的字元陣列。*/
int a[3][4];
上面最後一個例子創建了一個陣列,但也可以把它看成是一個多維陣列。注意陣列的下標從0開始。這個陣列的結構如下:
a[0][0] |
a[0][1] |
a[0][2] |
a[0][3] |
a[1][0] |
a[1][1] |
a[1][2] |
a[1][3] |
a[2][0] |
a[2][1] |
a[2][2] |
a[2][3] |
例子中notfull創建了一個3*3的二維陣列,初始化時有些元素並未賦值。如下:
- 1 0 0
- 1 2 3
- 4 5 0
為0的位置的數值是隨機的。
指针 [编辑]
如果一个变量声明时在前面使用 * 号,表明这是个指针型变量。换句话说,该变量存储一个地址,而 *(此处特指单目运算符 * ,下同。C语言中另有 双目运算符 * ) 则是取内容操作符,意思是取这个内存地址里存储的内容。指针是 C 语言区别于其他同时代高级语言的主要特征之一。
指针不仅可以是变量的地址,还可以是数组、数组元素、函数的地址。通过指针作为形式参数可以在函数的调用过程得到一个以上的返回值(不同于return(z)这样的仅能得到一个返回值。
指针是一把双刃剑,许多操作可以通过指针自然的表达,但是不正确的或者过分的使用指针又会给程序带来大量潜在的错误。
例如:
int * api[3];/* 由指向整型数据的指针构成的数组,长度为 3 */
char ** argv; /* 指向一个字符指针的指针 */
struct
{
int member;
} stinst, * pst = & stinst; /* pst是一个指向一个匿名结构体的指针 */
储存在指针中的地址所指向的数值在程序中可以由 * 读取。例如,在第一个例子中, *pi 是一个整型数据。这叫做引用一个指针。
另一个运算符 &,叫做取地址运算符,它将返回一个变量、数组或函数的存储地址。因此,下面的例子:
pi = &i;
i 和 *pi 在程序中可以相互替换使用,直到 pi 被改变成指向另一个变量的地址。
当指针指向结构体时,可以使用运算符 -> 代替 *和. 的作用,如以下两个表达式为等效:
pst->member
字串 [编辑]
C语言的字符串其实就是char型数组,所以使用字串並不需要引用庫。但是C標準庫確實包含了一些用於對字串進行操作的函數,使得它們看起來就像字串而不是陣列。使用這些函數需要引用標頭檔<string.h>。
文件輸入/輸出 [编辑]
在C語言中,輸入和輸出是經由標準函式庫中的一組函數來實現的。在ANSI/ISO C中,這些函數被定義在標頭檔<stdio.h>中。
標準輸入/輸出 [编辑]
有三個標準輸入/輸出是标准I/O库預先定義的:
- stdin 標準輸入
- stdout 標準輸出
- stderr 輸入輸出錯誤
下面的這個例子顯示了一個過濾程式(filter program)是怎樣構成的。
int main(int argc, const char * argv[])
{
int c;
while (1)
{
c = getchar();
if (c==EOF)
{
perror("getchar()");
return -1;
}
putchar(c);
}
return 0;
}
函数 [编辑]
C语言的基本结构单位是函数。系统首先调用main函数(主函数),通过函数的嵌套调用,再调用其他函数。函数可以是系统自带的函数,也可以是用户定义的函数。C语言中,不允许函数的嵌套声明。
内存管理 [编辑]
C语言的特色之一是:程序员必须亲自处理内存的分配细节。
C语言使用栈(Stack)来保存函数返回地址/栈祯基址、完成函数的参数传递和函数局部变量的存储。 如果程序需要在运行的过程中动态分配内存,可以利用堆(Heap)来实现。
基本上C程序的元素存储在内存的时候有3种分配策略:
- 静态分配
如果一个变量声明为全局变量或者是函数的静态变量,这个变量的存储将使用静态分配方式。静态分配的内存一般会被编译器放在数据段或代码段来存储,具体取决于实现。这样做的前提是,在编译时就必须确定变量的大小。 以IA32的x86平台及gcc编译器为例,全局及静态变量放在数据段的低端;全局及静态常量放在代码段的高端。
- 自动分配
函数的自动局部变量应该随着函数的返回会自动释放(失效),这个要求在一般的体系中都是利用栈(Stack)来满足的。相比于静态分配,这时候,就不必绝对要求这个变量在编译时就必须确定变量的大小,运行时才决定也不迟,但是C89仍然要求在编译时就要确定,而C99放松了这个限制。但无论是C89还是C99,都不允许一个已经分配的自动变量运行时改变大小。
所以说C函数永远不应该返回一个局部变量的地址。
要指出的是,自动分配也属于动态分配,甚至可以用alloca函数来像分配堆(Heap)一样进行分配,而且释放是自动的。
- 动态分配
还有一种更加特殊的情况,变量的大小在运行时有可能改变,或者虽然单个变量大小不变,变量的数目却有很大弹性,不能静态分配或者自动分配,这时候可以使用堆(Heap)来满足要求。ANSI C定义的堆操作函数是malloc、calloc、realloc和free。
使用堆(Heap)内存将带来额外的开销和风险。
安全问题 [编辑]
C语言的特色之一是:语言不负责内存边界检查。最重要的是指针操作
库 [编辑]
C語言的标准文档要求了一个平台移植C语言的时候至少要实现的一些功能和封装的集合,称为“标准库”,标准庫的声明头部通過预处理器命令#include進行引用。
在C89標準中:
| 文件 | 简介说明 |
|---|---|
| <assert.h> | 断言相关 |
| <ctype.h> | 字符类型判断 |
| <errno.h> | 标准报错机制 |
| <float.h> | 浮点运算 |
| <limits.h> | 各种体系结构限制 |
| <locale.h> | 本地化接口 |
| <math.h> | 数学函数 |
| <setjmp.h> | 跨函数跳转 |
| <signal.h> | 信号(类似UNIX的信号定义,但是差很远) |
| <stdarg.h> | 可变参处理 |
| <stddef.h> | 一些标准宏定义 |
| <stdio.h> | 标准I/O库 |
| <stdlib.h> | 标准工具库函数 |
| <string.h> | ASCIIZ字符串及任意内存处理函数 |
| <time.h> | 时间相关 |
在94年的修正版中
- <iso646.h>
- <wchar.h>
- <wctype.h>
在C99中增加了六個函式庫
- <complex.h>
- <fenv.h>
- <inttypes.h>
- <stdbool.h>
- <stdint.h>
- <tgmath.h>
以上是C语言的标准,而各个平台各自又对C库函数进行的各种扩充,就浩如烟海了。如POSIX C、GNU C等。
工具軟體 [编辑]
工具軟體可以幫助程式設計者避免一些程式中潛藏或容易出現的問題,例如常會造成程式未預期動作或是執行期錯誤的程式碼。
許多語言都有自動源代碼檢查及審計工具,C語言也有類似工具,像是Lint。可以在程式剛寫好時用Lint找出可能有問題的程式,通過Lint後再用C編譯器進行編譯,許多編譯器也可以設定是否要針對一些可能有問題的程式碼提出警告。MISRA C是一套針對嵌入式系統的法則,可主要也是避免一些可能有問題的程式碼。
也有一些編譯器、程式庫或作業系統可以處理一些非標準C語言的功能,例如邊界值檢查、缓存溢出偵測、序列化及自動垃圾回收功能。
使用像Valgrind或IBM Rational Purify等軟體工具,或者連結有特別malloc函式的程式庫,有助於找出一些運行期記憶體使用的問題。
保留关键字 [编辑]
| char | short | int | unsigned |
| long | float | double | struct |
| union | void | enum | signed |
| const | volatile | typedef | auto |
| register | static | extern | break |
| case | continue | default | do |
| else | for | goto | if |
| return | switch | while | sizeof |
C99新增关键字 [编辑]
| _Bool | _Complex | _Imaginary | inline | restrict |
C11新增关键字 [编辑]
| _Alignas | _Alignof | _Atomic | _Generic | _Noreturn |
| _Static_assert | _Thread_local |
經典錯誤 [编辑]
void main的用法并不是任何標准制定的[6] [7],是Microsoft制定的。 C語言正確的語法是int main[8]。 在 C++ 標準中,雖然 main 的標準型態應是 int,但編譯器實作中也可以自行定義型態,不過,所有實作均應接受 int main 的用法[9]。
C// [编辑]
C// 是一种结构化的并行语言,读作C parallel。它基于标准C语言但扩展了为数不多的构造用来表示并行性和进程交互。C// 的核心是称为一致区域的构造,它方便了结构化的、确定的、终止的和复合的并行程序的开发。[來源請求]
參考文獻 [编辑]
- ^ TIOBE Programming Community Index [TIOBE编程社区指数]. 2012 [2012-11-03] (英文).
- ^ GCC从3.0版本开始正式支持C99(-std=c99)
- ^ 经测试,gcc4.4.3使用C99标准的结果依然是00011100,即逻辑移位。
- ^ GCC、Clang等实现中,64位代码的long类型为64位,而MSVC中则维持32位
- ^ ISO/IEC 9899:201x (ISO C11) Committee Draft
- ^ Bjarne Stroustrup's C++ Style and Technique FAQ (Modified October 4, 2009) - Can I write "void main()"?
- ^ 用 C99 进行开放源代码的开发
- ^ ISO/IEC 9899-1999, Section 5.1.2.2.1 Program startup
- ^ 「It shall have a return type of type int, but otherwise its type is implementation-defined. All implementations shall allow both of the following definitions of main: ...(下略)」,引自 ISO/IEC 14882, 第一版(1998)與第二版(2003), section 3.6.1 Main function
- Brian Kernighan, Dennis Ritchie: The C Programming Language. Also known as K&R — The original book on C.
- 1st, Prentice Hall 1978; ISBN 0-13-110163-3. Pre-ANSI C.
- 2nd, Prentice Hall 1988; ISBN 0-13-110362-8. ANSI C.
- ISO/IEC 9899. The official C:1999 standard, along with technical corrigenda and a rationale. As of 2005 the latest version is ISO/IEC 9899:TC2.
- Samuel P. Harbison, Guy L. Steele: C: A Reference Manual. This book is excellent as a definitive reference manual, and for those working on C compilers. The book contains a BNF grammar for C.
- 4th, Prentice Hall 1994; ISBN 0-13-326224-3.
- 5th, Prentice Hall 2002; ISBN 0-13-089592-X.
- Derek M. Jones: The New C Standard: A Cultural and Economic Commentary, Addison-Wesley, ISBN 0-201-70917-1, online material
- Robert Sedgewick: Algorithms in C, Addison-Wesley, ISBN 0-201-31452-5 (Part 1–4) and ISBN 0-201-31663-3 (Part 5)
- William H. Press, Saul A. Teukolsky, William T. Vetterling, Brian P. Flannery: Numerical Recipes in C (The Art of Scientific Computing), ISBN 0-521-43108-5
外部連結 [编辑]
- Coding Programmer Page / C Library Reference and Examples (english)
- GCC 首页
- GLIBC2 首页
- Visual Studio Express 首頁
- ISO/IEC 9899。C99标准的官方网站。目前(2009年)可直接下载的标准文本是 ISO/IEC 9899:201x。
参见 [编辑]
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||