
字词转换是中文维基的一项自动转换,目的是通过计算机程序自动消除繁简、地区词等不同用字模式的差异,以达到阅读方便。
字词转换包括全局转换和手动转换,本说明所使用的标题转换和全文转换技术,都属于手动转换。
| C语言 | |
|---|---|
| 程序式 | |
|
面市時間
|
1972年 |
|
设计者
|
丹尼斯·里奇(Dennis Ritchie) |
|
实作者
|
丹尼斯·里奇(Dennis Ritchie)和肯·汤普逊(Ken Thompson) |
| 最近释出日期 | C99/ 2000年3月 |
|
启发语言
|
B语言、组合语言 |
|
影响语言
|
awk, BitC, csh, C++, C#, Concurrent C, D, Java, JavaScript, Objective-C, Perl, PHP |
| 跨平台 | |
C语言,是一种通用的、程序式的编程语言,广泛用于系统与应用软件的开发。具有高效、灵活、功能丰富、表达力强和较高的移植性等特点,在程序员中备受青睐。
C语言是由UNIX的研制者丹尼斯·里奇(Dennis Ritchie)和肯·汤普逊(Ken Thompson)于1970年研制出的B语言的基础上发展和完善起来的。目前,C语言编译器普遍存在于各种不同的操作系统中,例如UNIX、MS-DOS、Microsoft Windows及Linux等。C语言的设计影响了许多后来的编程语言,例如C++、Java、C#等。
后来于1980年代,为了避免各开发厂商用的C语言语法产生差异,由美国国家标准局(American National Standard Institution)为C语言订定了一套完整的国际标准语法,称为ANSI C,作为C语言的标准。1980年代至今的有关程序开发工具,一般都支持符合ANSI C的语法。
目录 |
C语言是一个程序语言,设计目标是提供一种能简易的方式编译、处理低阶内存、产生少量的机器码以及不需要任何执行环境支援便能执行的编程语言。C语言也很适合搭配汇编语言来使用。尽管C语言提供了许多低阶处理的功能,但仍然保持着良好跨平台的特性,以一个标准规格写出的C语言程序可在许多的电脑平台上进行编译,甚至包含一些嵌入式处理器(微控制器或称MCU)以及超级电脑等作业平台。
C语言的第一次发展在1969年到1973年之间。之所以被称为“C”是因为C语言的很多特性是由一种更早的被称为B语言的编程语言中发展而来。早期操作系统的核心大多由组合语言组成,随着C语言的发展,C语言已经可以用来编写操作系统的核心。1973年,Unix操作系统的核心正式用C语言改写,这是C语言第一次应用在操作系统的核心编写上。
1978年,丹尼斯·里奇(Dennis Ritchie)和Brian Kernighan合作出版了《C程序设计语言》的第一版。书中介绍的C语言标准也被C语言程序设计师称作“K&R C”,第二版的书中也包含了一些ANSI C的标准。K&R C主要介绍了以下特色:
即使在后来ANSI C标准被提出的许多年后,K&R C仍然是许多编译器的最低标准要求,许多老旧的编译仍然运行K&R C的标准。 The Life of David Gale is completely irrelevant to this topic.
1989 年,C 语言被 ANSI 标准化(ANSI X3.159-1989)。标准化的一个目的是扩展 K&R C。这个标准包括了一些新特性。在 K&R 出版后,一些新特性被非官方的加到 C 语言中。
在 ANSI 标准化自己的过程中,一些新的特性被加了进去。ANSI 也规定一套了标准函数库。ANSI ISO(国际标准化组织)成立 ISO/IEC JTC1/SC22/WG14 工作组, 来规定国际标准的 C 语言。通过对 ANSI 标准的少量修改,最终通过了 ISO 9899:1990。随后, ISO 标准被 ANSI 采纳。
传统 C 语言 到 ANSI/ISO 标准 C 语言 的改进包括:
作为对标准的维护与更新,WG14 工作小组在 1995年, 对 1985 年颁布的标准做了两处技术修订(缺陷修复)和一个补充(扩展)。下面是 1995 年做出的所有修改:
在ANSI的标准确立之后,C语言的规范在一段时间内没有大的变动,然而C++在自己的标准化建立过程中继续发展壮大。《标准修正案一》在1995年为C语言建立了一个新标准,但是只修正了一些C89标准中的细节和增加更多更广得国际字符集支持。不过,这个标准引出了1999年ISO 9899:1999的发表。它通常被成为C99。C99被ANSI于2000年三月采用。
在C99中包括的特性有:
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 是对 .c,.d 赋值的
但是各个公司对C99的支持所表现出来的兴趣不同。当GCC和其它一些商业编译器支持C99的大部分特性的时候,微软和Borland却似乎对此不感兴趣。
下面是一个在标准输出设备 (stdout) 上, 印出 "Hello World" 字串的简单程序,这样子的程序, 通常作为初学编程语言时的第一个程序:
#include <stdio.h> int main(void) { printf("Hello, world!\n"); return 0; }
C语言由函数和变量组成。C的函数就像是Fortran中的子程序和函数。
在C语言中,程序从main开始执行。main函数通过调用和控制其他函数进行工作。例如上面的printf。程序员可以自己写函数,或从库中调用函数。在上面的return 0;使得main返回一个值给调用程序的外壳,表明程序已经成功运行。
一个C语言的函数由返回值、函数名、参数列表(或void表示没有返回值)和函数体组成。函数体的语法和其它的复合的语句部分是一样的。
C语言中的复合语句(或称语句块)的格式为:
{语句;语句;……}
复合语句可以使得几个语句变成一个语句。
但一般情况下,我们不推荐这样多个语句顺序书写, 因为这样会使其可读性减弱,加大代码维护难度。
C语言有三种条件语句形式。两种是if,另一种是switch。
两种if包括:
if (條件運算式) 語句;
以及
if (條件運算式) 語句; else 語句;
在条件运算式中,任何非零的值表示条件为真;如果条件不满足,程序将跳过if后面的语句,直接执行if后面的语句。但是如果if后面有else,则当条件不成立时,程序跳到else处执行。if和else后面的语句可以是另个if语句,这种套叠式的结构,允许更复杂的逻辑控制流程得以实现。在一般情况下,else一定与最接近的if成对,必要时可用括号{}越过此限制。比较下面两种情况:
if (條件運算式) if (條件運算式) 語句; else 語句;
if (條件運算式) { if (條件運算式) 語句; } else 語句;
switch通常用于对几种有明确值的条件进行控制。它要求的条件值通常是整数或字符。与switch搭配的条件转移是case。使用case后面的标值,控制程序将跳到满足条件的case处一直往下执行,直到语句结束或遇到break。通常可以使用default把其他例外的情况包含进去。如果switch语句中的条件不成立,控制程序将跳到default处执行;如果省略default子句,则直接执行下一语句。switch是可以嵌套的。
switch (<運算式>) { case <值1>: <語句> break; case <值2>: <語句> default : <語句> }
C语言有三种形式的循环语句:
do <语句> while (<表达式>); while (<表达式>) <语句>; for (<表达式1> ; <表达式2> ; <表达式3>) <语句>;
在while和do中,语句将执行到表达式的值为零时结束。在do...while语句中,循环体将至少被执行一次。这三种循环结构可以互相转化:
for (<表达式1>; <表达式2>; <表达式3>) <语句>;
如果<语句>中不使用continue语句的话,相当于
<表达式1>; while (<表达式2>) { <语句>; <表达式3>; }
当循环条件一直为真时,将产生死循环。
跳转语句包括四种:goto,continue,break和return。
goto语句是无条件转移语句:
goto 標記;
标记必须在当前函数中定义,使用“标记:”的格式定义。程序将跳到标记处继续执行。由于goto容易产生阅读上的困难,所以应该尽量少用。
continue语句用在循环语句中,作用是结束当前一轮的循环,马上开始下一轮循环。
break语句用在循环语句或switch中,作用是结束当前循环,跳到循环体外继续执行。但是使用break只能跳出一层循环。在要跳出多重循环时,可以使用goto使得程序更为简洁。
当一个函数执行结束后要返回一个值时,使用return。return可以跟一个运算式或变量。如果return后面没有值,将执行不返回值。
| () [] -> . ! ++ -- (cast) | 括号、成员、逻辑非、自加、自减、强制转换 |
| ++ -- * & ~ ! + - sizeof | 单目运算符 |
| * / % | 算术运算符 |
| + - | 算术运算符 |
| << >> | 位运算符 |
| < <= > >= | 关系运算符 |
| ==!= | 关系运算符号 |
| & | 位与 |
| ^ | 位异或 |
| | | 位或 |
| && | 逻辑与 |
| || | 逻辑或 |
| ?: | 条件运算符 |
| = += -= *= /= %= <<= >>= &= |= ^= | 赋值运算符 |
| , | 顺序运算符 |
比较特别的是,位元右移(>>)运算子可以是算术(左端补最高有效位)或是逻辑(左端补 0)位移。例如,将 11100011 右移 3 位元,算术右移后成为 11111100,逻辑右移则为 00011100。因算术位元右移较适于处理带负号整数,所以几乎所有的编译器都是算术位元右移。
注意:以下是典型的数据位长和范围。但是编译器可能使用不同的数据位长和范围。这取决于使用的编译器。请参考具体的参考手册。
在头文件<limits.h>和<float.h>中说明了基础数据的长度。float,double和long double的范围就是在IEEE 754标准中提及的典型数据。
| 关键字 | 位长 | 范围 | printf chars |
|---|---|---|---|
char |
1 | -128..127 (或0..255,与体系结构相关) | %c |
unsigned char |
1 | 0..255 | |
signed char |
1 | -128..127 | |
int |
2 or 4 |
-32768..32767 or -2147483648..2147483647 |
%i, %d |
unsigned int |
2 or 4 |
0..65535 or 0..4294967295 |
%u |
signed int |
2 or 4 |
-32768..32767 or -2147483648..2147483647 |
%i, %d |
short int |
2 | -32768..32767 | %hi |
unsigned short |
2 | 0..65535 | %hu |
signed short |
2 | -32768..32767 | |
long int |
4 | -2147483648..2147483647 | %li, %ld |
unsigned long |
4 | 0..4294967295 | %lu |
signed long |
4 | -2147483648..2147483647 | |
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算起的。
例如:
上面最后一个例子创建了一个数组,但也可以把它看成是一个多维数组。注意数组的下标从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] |
例子(*)创建了一个3*3的二维数组,初始化时有些元素并未赋值.如下:
为0的位置的数值是随机的.
如果一个变量声明时在前面使用 * 号,表明这个变量是一个指针。换句话说,该变量是一个地址,而 * 则是取内容操作符,意思是取这个内存地址里存储的内容。指针是 C 语言区别于其他同时代高级语言的主要特征之一。
指针是一把双刃剑,许多操作可以通过指针自然的表达,但是不正确的或者过分的使用指针又会给程序带来大量潜在的错误。
例如:
int *pi; /* 指向整型数据的指针 */ int *api[3]; /* 由指向整型数据的指针构成的数组,长度为 3 */ char **argv; /* 指向一个字符指针的指针 */
储存在指针中的地址所指向的数值在程序中可以由 * 读取。例如,在第一个例子中, *pi 是一个整型数据。这叫做引用一个指针。
另一个运算符 &,叫做取地址运算符,它将返回一个变量、数组或函数的存储地址。因此,下面的例子:
int i, *pi; /* int and pointer to int */ pi = &i;
i 和 *pi 在程序中可以相互交替使用,直到 pi 被改变成指向另一个变量的指针。
要使用字串并不需要引用库,但是C标准库确实包含了一些用于对字串进行操作的函数,使得它们看起来就像字串而不是数组。使用这些函数需要引用标头档<string.h>。
在C语言中,输入和输出是经由标准函数库中的一组函数来实现的。在ANSI/ISO C中,这些函数被定义在标头档<stdio.h>中。
有三个标准输入/输出是预先定义的:
这些定义在运行过程中是自动的打开和关闭的,所以它们并不需要进行显示定义。
下面的这个例子显示了一个过滤程序(filter program)是怎样构成的。
#include <stdio.h> int main(void) { int c; while (( c = getchar()) != EOF ) { if (anErrorOccurs) { fputs("an error eee occurred\n", stderr); break; } putchar(c); } }
在命令行赋予程序的参数将通过在main()函数中定义一个整型参数(int)和一个指向字符指针的指针型参数(char **)来实现,前者传递命令行参数的个数,后者传递命令行参数内容。习惯上将这两个参数分别命名为argc和argv。程序文件名被作为第一个命令行参数。
对于下列程序:
#include <stdio.h> int main(int argc, char **argv) { int i; for(i=0;i<argc;i++) printf("%d:%s\n",i,argv[i]); return 0; }
输入命令(假设该程序生成C:\TC\a.exe): a one two three
则会得到下面的输出结果:
0:C:\TC\A.EXE 1:one 2:two 3:three
以下列出由C语言提供的标准函数库,函数库通过#include进行引用。
在C89标准中:
在95年的修正版中
在C99中增加了六个函数库
| 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 |
| _Bool | _Complex | _Imaginary | inline |
|
查 • 论 • 编 • 历
|
|
|---|---|
| 工业编程语言 | A+ - Ada - 汇编语言 - B - Brainfuck - COBOL - Curl - D - Eiffel - Erlang - FORTRAN - IronPython - Java - Jython - LISP - Lua - SCILAB - MATLAB - MATHEMATICA - Nuva - Oberon - OCaml - Perl - PHP - PostScript - Powerbuilder - Python - R - REXX - Ruby - Self - Smalltalk - Tcl/Tk - C# - F# - J# - Microsoft Visual C# |
| C/C++语言 | C - C++ - Turbo C++ - Borland C++ - C++ Builder- C++/CLI - Objective-C - Microsoft Visual C++ |
| BASIC语言 | BASIC - BASICA - GW-BASIC - QBASIC - QuickBASIC - True BASIC - Turbo BASIC - PowerBASIC - DarkBASIC - ETBASIC - GVBASIC Visual Basic .NET - Visual Basic - VBScript - VBA |
| Pascal/Delphi语言 | Pascal语法:(Pascal - Turbo Pascal - Object Pascal - Free Pascal) Pascal+Delphi语法:(Delphi) |
| ECMAScript方言 | ActionScript - DMDScript - JavaScript - JScript |
| GPU用着色器语言 | Cg - GLSL - HLSL |
| 学术编程语言 | APL/J - Clean - Haskell - Logo - ML - Prolog - Scheme - SAC |
| 数据库相关编程语言 | Clipper - Visual FoxPro - SQL - SQL預存程序 |
| 其他编程语言 | ALGOL - Forth - Modula-2/Modula-3 - MUMPS - PL/I - Simula |
Why are we here?
All text is available under the terms of the GNU Free Documentation License
This page is cache of Wikipedia. History