C语言:修订间差异
删除的内容 添加的内容
撤销203.198.141.90(讨论)的版本65709845 纯繁简转换 标签:撤销 |
FrankYang0610(留言 | 贡献) 无编辑摘要 |
||
(未显示21个用户的41个中间版本) | |||
第2行:
{{Multiple issues|
{{too many sections}}
{{Trivia|time=2020-06-18T02:37:08+00:00}}
}}
第22行 ⟶ 第21行:
|name = C語言
|logo = File:The C Programming Language logo.svg
|logo_size =
|logo caption =《[[C程序设计语言 (书)|C程序设计语言]]》,第一部介绍C语言的书籍
|paradigm = 程序式[[指令式编程]]([[过程式编程|过程式]])、[[结构化编程]]
|year = {{start date and age|1972
|designer = [[丹尼斯·里奇]](Dennis Ritchie)
|developer = [[丹尼斯·里奇]](Dennis Ritchie)和[[肯·汤普逊]](Ken Thompson)
|latest_release_version = [https://www.iso.org/standard/74528.html ISO/IEC 9899:2018]([[#C18|C18]])
|latest_release_date = 2018年6月
| typing = [[类型系统|静态]], [[弱类型]], {{le|明示类型|Manifest typing|明示}}, {{le|名称类型系统|Nominal type system|名称}}
|implementations = [[Clang]]、[[GCC]]、[[Microsoft Visual C++|MSVC]]、[[Turbo C]]、[[Watcom c|Watcom C]]
|influenced_by = [[B語言|B]]([[BCPL]]、[[CPL (程式語言)|CPL]])、[[ALGOL 68]]<ref name="dottcl"/>、[[組合語言]]、[[PL/I]]、[[FORTRAN]]
第36行:
|wikibooks = C Programming
}}
'''C语言'''(英語:'''C Language''')是一种通用的、[[过程式编程]][[程式語言]],支持[[结构化编程]]、词法作用域和[[递归]],使用静态类型系统,并且广泛用于[[系统软件]]与[[应用软件]]的开发
C语言于1969年至1973年間,為了移植與開發[[UNIX]][[作業系統]],由[[丹尼斯·里奇]]與[[肯·汤普逊]],以[[B语言]]为基础,在[[贝尔实验室]]設計、开发出來。二十世纪八十年代,C语言应用日渐广泛。為了避免各開發廠商用的C語言的語法產生差異,[[美國國家標準局]]為C語言訂定了一套完整的國際標準語法,稱為[[ANSI C]],作為C語言的標準。与此同时,[[国际标准化组织]]也接受该标准为国际标准。因此,ANSI C也同时被称为ISO C。二十世纪八十年代至今的有关程式開發工具,一般都支持符合[[ANSI C]]的語法。
C语言具有高效、灵活、功能丰富、表达力强和較高的[[移植 (軟體)|可移植性]]等特点,在[[程序设计|程式設計]]中备受青睐,成为最近25年使用最为广泛的编程语言<ref name="AutoTX-3">{{cite web
第48行 ⟶ 第50行:
|archive-url = https://web.archive.org/web/20181225175216/https://www.tiobe.com/tiobe-index/index/
|dead-url = yes
}}</ref>。目前,C语言[[編譯器]]普遍存在於各種不同的[[操作系统]]中,例如[[Microsoft Windows]]、[[Mac OS X|macOS]]、[[Linux]]、[[Unix]]等。C語言的設計影響了众多後來的程式語言,例如[[C++]]、[[Objective-C]]、[[Java]]、[[C♯|C#]]等。现行的许多软件都是由C语言或者其影响和衍生的编程语言开发出来的。
<!--== 設計 ==
C語言設計目標是提供一種能以簡易的方式編譯、處理低階記憶體、產生少量的[[機械碼]]以及不需要任何執行環境支援便能執行的程式語言。C語言也很適合搭配[[汇编语言|-{zh-hans:汇编语言; zh-hant:組合語言;}-]]來使用。儘管C語言提供許多低階處理的功能,但仍保持良好[[跨平台]]的特性,以一個標準規格寫出的C語言程式可在許多電腦平台上進行編譯,甚至包含一些嵌入式处理器([[微控制器]]或称MCU)以及[[超級電腦]]等作業平台。-->
== 概述 ==
与[[ALGOL]]一族的大多数过程式编程语言类似,C語言是一個有結構化程式設計、具有变量作用域(variable scope)以及遞迴功能的程序式語言。其采用的静态类型系统可以防止无意的程序设计操作。C语言中所有的可执行代码都被包含在[[子程序]](函数)裡。其傳遞參數均是以值傳遞(pass by value)<ref>{{ Cite book | author = Brian W. Kernighan and Dennis M. Ritchie | title = The C programming Language | publisher = Prentice-Hall | date = 1988 | ISBN = 0-13-110362-8 | language = en | quote = In C, all function arguments are passed ``by value.'' }}</ref>,另外也可以傳遞指针(a pointer passed by value)。C语言是自由形式语言,即其源代码的缩进并不影响程序的功能,而是使用[[分号]]作为[[陈述式|语句]]的结尾,[[花括号]]来表示[[代码块]]。
由于C语言的语言规模较小,若干高层的机制需要使用定义的函数来提供。比如,C语言并没有直接处理复合对象(例如[[字符串]]、集合、列表、数组等)的操作,也没有对于[[存储器]]分配工具和内存回收工具的直接定义,同时也本身不具有输入和输出以及文件访问的方法。然而,用户定义的函数和C语言[[标准库]]中的函数为这些高层的机制提供了可能性。<ref name="k&r中文"/>
* 基本数据类型包括字符、整型和浮点数等。另外也有派生的各种数据类型,如[[指针]]、[[数组]]、结构和联合。
* 部份的变量類型可以轉換,例如整數型和字符型变量。
* 透過[[指標 (電腦科學)|指標]](pointer),C語言可以容易的對記憶體進行低階控制。
* 不同的變數類型可以用結構体(struct)組合在一起。
* 具有基本的控制流:语句组、条件判断、多路选择、循环等。
* 函数可以返回各种数据类型的值,并且都可以递归调用。每次调用函数会重新创建变量。
* C语言只有32個保留字(reserved keywords),使变量、函數命名有更多彈性。
* 编译预处理(preprocessor)讓C語言的編譯更具有彈性。
== 歷史 ==
{{main|C语言的历史}}
20世纪70年代,肯·汤姆森为了使其设计的Unix系统更加高效,使用B语言的变种(即C语言)在DEC PDP-7计算机上重写了Unix。C语言中许多重要概念来源于[[BCPL]]语言,其对C语言的影响也间接地来源于[[B语言]]。在1978年,[[丹尼斯·里奇]]和[[布萊恩·柯林漢]]合作出版了《[[C程序设计语言 (书)|C程序设计语言]]》第一版,事实上即为K&R C标准<ref> {{Cite book | author = Stephen Prata | title = C Primer Plus(第5版) | url = https://archive.org/details/cprimerplusdiwub0005unse | location = 北京 | publisher = 人民邮电出版社 | date = 2005年2月 | pages = [https://archive.org/details/cprimerplusdiwub0005unse/page/3 3]-4 | ISBN = 9787115130228 | accessdate = 2020-07-15 | language = 中文 }} </ref>。1983年,为了制定一个独立于具体机器且无歧义的C语言标准,[[美国国家标准协会]]成立了一个委员会,并在1988年完成了该标准的制定,即ANSI C。此标准同时被[[国际标准化组织]]所采纳,也被称作ISO C。
其后,C语言至今经历了几次标准更新,诞生了[[C99]]、[[C11 (C语言标准)|C11]]和目前最新的标准[[C18 (C语言标准)|C18]]。C语言标准的下一次更新C2x目前正在起草中。
== 語法 ==
{{Main|C语言语法}}
{{expand section}}
C語言的语法相对简洁而直接。C语言的[[形式文法]]由[[国际标准化组织]]所制定。<ref name="isowg">{{Cite web|title=ISO/IEC JTC1/SC22/WG14 - C|url=http://www.open-std.org/jtc1/sc22/wg14/|language=en|archive-url=https://web.archive.org/web/20180212100115/http://www.open-std.org/jtc1/sc22/wg14/|archive-date=2018-02-12|accessdate=2022-04-02}}</ref>簡單來說,C語言包括如下文法:
# 作为一种[[指令式编程]]语言,C语言使用语句执行操作。最常见的语句是[[表达式]]语句,由一个表达式后加一个分号组成,可以令系统调用函数和为变量赋值;
# 註釋: C语言支持单行注释(以<code>//</code>开头)和多行注释(以<code>/*</code>开始,以<code>*/</code>结束);
# 数据类型: 基本的数据类型包括整数(<code>int</code>)、浮点数(<code>float</code>和<code>double</code>)、字符(<code>char</code>)、枚舉<code>enum</code>等;
# 数组: 数组是一组相同类型的数据元素的集合。使用以下方法初始化一個五個元素的整數數組:<syntaxhighlight lang="c">
int numbers[5] = {1, 2, 3, 4, 5};
</syntaxhighlight>
# 封裝結構:结构(<code>struct</code>)、联合(<code>union</code>);
# 結構化編程和控制结构: C语言包括条件语句(<code>if</code>、<code>else</code>)、循环语句(<code>for</code>、<code>while</code>、<code>do-while</code>)等;
# 跳轉語句:C語言允許使用跳轉關鍵字<code>goto</code>、<code>break</code>和<code>continue</code>來實現程序塊之間的跳轉,這和匯編語言的<code>jmp</code>關鍵字有一定相似處;
# 函数: C语言中的函数是程序的基本模块,可以自定义函数并在程序中调用;
# 靈活且靠近底層的內存控制機制:C程序員可以自由選擇分配何種內存,以及分配多大的內存,如如下代碼所示:<syntaxhighlight lang="c">
int *array = (int *)malloc(5 * sizeof(int)); // 分配一個包含五個整數的數組
free(array); // 釋放使用malloc分配的內存
</syntaxhighlight>
== Hello World 程序 ==
{{main|Hello World}}
[[File:Hello World Brian Kernighan 1978.jpg|缩略图|Brian Kernighan于1978年亲笔书写的“Hello World”程序]]
{{Quote box|
width=25%
|align=right
|quote="对于所有语言的初学者来说,编写的第一个程序几乎都是相同的,即‘请打印出下列内容 hello, world’"
|source=– 《C程序设计语言》<ref name="k&r中文"/>}}
现在广泛被编程初学者使用的"hello, world"程序实例最初就是出现在《[[C程序设计语言]]》第一版中。下面是一個在標準輸出設備(stdout)上打印出 "[[Hello World程序|Hello, world!]]" 字串的簡單程式。類似的程式,通常作為初學程式語言時的第一個程式:
<syntaxhighlight lang="c" line="1o">
#include <stdio.h>
int main(void) {
printf("Hello, world!\n");
return 0;
}
</syntaxhighlight>
其中只有int,void,return为C语言的关键字,[[C预处理器|预处理器]]会将<code>#include <stdio.h></code>替换为stdio.h文件的内容。
main函数是C语言程序的[[入口点]]。
<code>"Hello, world!\n"</code>中的<code>\n</code>是一个[[转义字符]],形式为<code>\</code>加上一个字符。所起的作用在[[ASCII]]码中规定。
printf是声明于stdio.h的函数,关于printf的更多细节,参见[[printf]];
关于格式化字符串的更多信息,参见[[格式化字符串]]。
== 内存管理 ==
C语言的特色之一是:程序员必须亲自处理内存的分配细节。语言不负责内存边界检查,这是因为在运行时进行内存边界检查会造成[[性能问题]],与[[Unix哲学|UNIX哲学]]不符。此特性容易导致[[缓冲区溢出]]问题。然而,部分编译器(如英特尔编译器)会出于安全性的考量,提供方法以进行运行时内存边界检查<ref>{{cite web |title=check-pointers, Qcheck-pointers |url=https://software.intel.com/content/www/us/en/develop/documentation/cpp-compiler-developer-guide-and-reference/top/compiler-reference/compiler-options/compiler-option-details/data-options/check-pointers-qcheck-pointers.html |website=Intel |accessdate=2021-06-01 |language=en |archive-date=2021-02-15 |archive-url=https://web.archive.org/web/20210215091914/https://software.intel.com/content/www/us/en/develop/documentation/cpp-compiler-developer-guide-and-reference/top/compiler-reference/compiler-options/compiler-option-details/data-options/check-pointers-qcheck-pointers.html }}</ref>。
大多数C语言实现使用栈(Stack)来保存函数返回地址/栈帧基址、完成函数的参数传递和函数局部变量的存储。然而,在部分极特殊的平台上,使用栈并不能获得最大效率。此时的实现由编译器决定<ref name="C18">{{Cite web |url =http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2310.pdf |accessdate =2020-06-10 |title =ISO/IEC 9899:2018 |archive-date =2020-07-22 |archive-url =https://web.archive.org/web/20200722132012/http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2310.pdf |dead-url =no }}</ref>。
如果程序需要在运行的过程中动态分配内存,可以利用[[堆]](Heap)来实现。
第349行 ⟶ 第154行:
* 动态分配
还有一种更加特殊的情况,变量的大小在运行时有可能改变,或者虽然单个变量大小不变,变量的数目却有很大弹性,不能静态分配或者自动分配,这时候可以使用
使用
== 库 ==
第392行 ⟶ 第194行:
|<stdlib.h>||标准工具库函数
|-
|<string.h>||
|-
|<nowiki><time.h></nowiki>||时间相关
|}
在94年的修正版中<tt>
* <iso646.h>
* <wchar.h>
* <wctype.h></tt>
在C99中增加了六個函式庫<tt>
* <complex.h>
* <fenv.h>
第413行 ⟶ 第210行:
* <stdbool.h>
* <stdint.h>
* <tgmath.h></tt>
以上是C语言的标准。各个系统各自又对C库函数进行的各种扩充,就浩如烟海了。如[[POSIX C]]、[[GNU C]]等。
第425行 ⟶ 第221行:
也有一些編譯器、程式庫或作業系統可以處理一些非標準C語言的功能,例如邊界值檢查、[[缓存溢出]]偵測、[[序列化]]及[[垃圾回收 (計算機科學)|自動垃圾回收]]功能。
使用像[[Valgrind]]或{{
== 經典錯誤 ==
第489行 ⟶ 第240行:
==參考資料==
{{div ref|
* [[Brian Kernighan]], [[Dennis Ritchie]]: ''[[
**
**
** 中译本第二版,机械工业出版社 2004; ISBN 978-7-11-112806-9。
* [http://www.open-std.org/JTC1/SC22/WG14/www/standards ISO/IEC 9899]. The official C:1999 standard, along with technical corrigenda and a rationale. As of 2005 the latest version is [http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1124.pdf 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 [[compiler]]s. The book contains a [[Backus-Naur form|BNF]] grammar for C.
第505行 ⟶ 第257行:
* [http://code-reference.com/c Coding Programmer Page / C Library Reference and Examples<nowiki></nowiki>]{{Wayback|url=http://code-reference.com/c |date=20130121220502 }} (english)
* [http://gcc.gnu.org/ GCC 首页]{{Wayback|url=http://gcc.gnu.org/ |date=20120111104818 }}
* [http://www.gnu.org/software/libc/ GLIBC2 首页]{{
* [http://www.microsoft.com/taiwan/vstudio/express/ Visual Studio Express 首頁]{{Wayback|url=http://www.microsoft.com/taiwan/vstudio/express/ |date=20070812203722 }}
* [http://www.open-std.org/JTC1/SC22/WG14/www/standards ISO/IEC 9899]{{Wayback|url=http://www.open-std.org/JTC1/SC22/WG14/www/standards |date=20150523043258 }}。C99标准的官方网站。目前(2020年)可直接下载的标准文本是 [http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2479.pdf ISO/IEC 9899:202x]{{Wayback|url=http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2479.pdf |date=20200610113538 }}。
|