C与C++

本文介绍了C语言和C++的发展历程,从C语言的起源、特点、K&R C到C89/C90和C99标准的演变。C99标准增加了对国际化编程的支持、修正了C89/C90的不足,如内联函数、变长数组、浮点常量的十六进制格式等。C和C++的区别在于函数原型、强制转换、const修饰符的处理、枚举和结构的使用等方面。C++对类型安全和程序健壮性更为关注,而C语言则更加注重效率和灵活性。
摘要由CSDN通过智能技术生成

C语言是C++的子集,C++C语言的超集。C++是在C语言的基础上,添加了面向对象和泛型编程的功能后,扩展而成的。

C语言是一种可移植的系统语言,起源于Unix操作系统的开发。C语言是一种灵活高效的高级程序设计语言,但是同时也具有一些面向机器的低级语言特征,所以有人称它是一种中级语言。

1)起源
虽然早在19574IBMJohn W. Bacus)就推出了第一个高级程序设计语言FORTRANFORmula TRANslation公式转换),1958GAMM/ACMJohn W. BackusPeter NaurC. A. R. Hoare)又推出了ALGOLALGOrithmic Language算法语言)。但它们都是为数学和科学计算设计的,不适合于系统编程。

1964John Kemeny Thomas Kurtz简化Fortran发明了BASICBeginners All-purpose Symbolic Instruction Code BASIC初学者通用指令码)语言,1970年瑞士计算机科学家Niklaus Wirth又在ALGOL68的基础上创造了Pascal语言。前者是为专入门的文科学生设计的,简单易学,至今仍然是业余爱好者的宠物;后者则是结构化程序设计语言的典范、结构优美,曾被广泛用于计算机教学;但是,它们的功能有限、灵活性不够、效率也不高,也都不适合于编写系统编程。

附注:1991年和2002年微软公司的Alan CooperPaul Vick分别开发出Visual BasicVisual Basic .NET1983Borland公司的Anders HejlsbergPhilippe Kahn 开发出Turbo Pascal1985Niklaus Wirth和苹果公司的Larry Tesler又创造了Object Pascal1995Borland公司的Anders Hejlsberg等人在其基础上开发出Delphi

1970年,AT&T贝尔实验室的Ken ThompsonDennis Ritchie等人在DEC公司的PDP-7小型机上开发出了Unix操作系统,最初的实现是用汇编语言写成的。为了使Unix操作系统 具有可移植性,迫切需要一种高级语言工具。为此,(出生在美国纽约的计算机科学家)Dennis RitchieB语言为基础,参考了Algol68,于1972年设计出了C语言。1973年他们用C语言重写了Unix1975年又利用C语言将Unix移植到了PDP-11上。

https://p-blog.csdn.net/images/p_blog_csdn_net/touzani/303255/o_Ken_n_dennis.jpg

2)特点

C语言是一种可移植的系统语言,拥有充分的控制语句和数据结构功能,包含丰富的操作符,从而能够提供强大的表达能力,可以用于许多不同的应用领域。但是,C语言并不是面向科学家和计算机业余爱好者的,而是专门为程序员设计的。

为了进行高效的系统编程,C语言提供了强大的功能和极大的灵活性。与其它高级语言相比,C语言的语法简洁、表达自由、库函数丰富。如果将编程比作造房子,则FortranBasic等语言就像一些已经预先造好的大预制件,使用起来简单快捷,但是灵活性差、且功能有限,只能造某些固定模式的房屋;而C语言就像一块块的小砖,使用起来虽然繁琐,但是灵活性强、而且功能无限,能够造各式各样的建筑物,不过这就要求C语言程序员具有很高的专业水平。

因此,C语言假设使用者都是计算机专家,采取的是程序员负责制。它不进行完备的类型检查,对数组越界也没有限制。为了进行高效的系统编程,C语言还提供了指针和指针运算,程序员可以随意操作全部内存,任意修改任何内容。

表达的自由性和操作的任意性,也给C语言带来了很多编程问题和安全隐患。特别是C语言的++/--运算符和指针运算,更是倍受指责。

与其它高级语言相比,C语言提供了一些低级语言特征,更面向机器。所以,也有人称C语言是介于高级语言和低级语言之间的一种中级语言。

3K&R C

开始的很多年,C语言没有国际标准,只有一个事实标准K&R C。直到1989年和1990年,才分别推出了ANSI CISO CC89C90);1999ISO又推出了第2版(C99)。

不像AlgolCOBOLAda等语言,C语言并不是政府部门或国际组织的产物,而属于个人的作品。虽然由于C语言性能优越,使用得越来越广泛,但是在最初的十几年间,C语言唯一的“标准”是1978Brian KemighanDennis Ritchie编写的《C程序设计语言》(The C Programming Language)一书,通常称其为K&R C或经典C

该书的附录“C参考手册”(C Reference Manual)成为了C语言的实现指南,但是书中缺少对库函数标准的描述,一般以Unix实现的库函数所为事实标准。

说明:因为C语言的语法成分简单,很多基本功能(例如I/O语句)都是靠库函数来实现的。所以,C语言比其它高级语言更依赖于库函数。

4C89/C90标准

1983ANSIAmerican National Standards Institute 美国国家标准协会)设立了一个X3J11小组,着手进行C语言的标准化。并最终于1989年推出ANSI C (ANSI X3.159-1989)1990年它又成为国际标准ISO CISO/IEC 9899:1990 Programming languages – C,程序设计语言——C),原来叫做ANSI CISO C,现在通常称其为C89C90

标准的指导原则是:

l     相信程序员;

l     不妨碍程序员做需要完成的事情;

l     让语言保持短小简单;

l     只提供一种方法来执行一种操作;

l     使程序运行速度快,即使不能保证其可移植性。(不追求定义的抽象统一,更优先考虑运行效率)

这些其实也正是C语言的设计初衷,所以ANSI/ISOC标准,对原始的C语言修改并不多。标准CK&R C的主要改变是,增加了函数原型(prototype),强调对函数的输入参数进行严格的类型检查;并补充定义了C语言的标准函数库。

函数原型的类型检查是指:在编译时,对调用函数的实参和函数定义时的形参的类型是否一致,进行严格的检查。目的是减少程序纠错的难度(这类问题在运行时很难查出),同时保证运行的安全和稳定性(避免函数调用栈溢出)。(这也为实现C++函数的参数型多态性提供了条件。)

例如:

u       K&R C:(过时的)

power(); // 函数的前向声明

power(x, n) // 函数定义

int x, n;

{

……

}

int p = power(3) * power(3.9, 5.4); // 使用(编译可通过,运行时产生逻辑错误)

u       C89/C90:(推荐的)

int power(int x, int n);  // 函数声明1(函数原型)

int power(int, int);  // 函数声明2(函数原型)

int power(int x, int n)  // 函数定义

{

……

}

int p = power(3) * power(3.9, 5.4); // 使用(编译不能通过,错误:第1个调用

// 的参数太少、警告:第2个调用的参数自动转换为(3, 5)

 

l     C89/C90K&R C的其它改变有:

n         删除了关键字:entry(条目/入口)

n         增加了关键字:const(常型变量)、enum(枚举类型)、signed(有符号的,例如signed char)、void(空/无,可用于函数返回值和形参、通用指针类型)、volatile(易变变量,防止编译器错误的优化)

n         传递结构:允许将结构本身作为参数传递给函数(原来只允许传地址)

n         函数原型:增加了函数原型(便于编译器进行类型检查)

n         增加了预处理指令:#elifelse if)、#error(错误,强制编译停止)、#line(修改当前行号和源文件名)、#pragma(附注/编译指令,编译器定义的与实现有关的指令)

n         定义了固有宏:__LINE__(当前行号)、__FILE__(源文件名)、__DATE__(当前系统日期)、__TIME__(当前系统时间)、__STDC__(标准C版时为1

5C99标准

C90的修订工作开始于1994年,在ISO C++1998)标准推出之后,ISO又于 1999 12 16 ,推出了C语言标准的第2版:ISO/IEC 9899:1999 Programming languages – C(程序设计语言——C),一般称其为C99

1)修订目标

C99保持了C语言的本质特性,C继续是一种短小、清晰和高效的语言。C99并没有增加新的本质特性,但是为了满足新的需要,也进行很多小的修订。

l     C99主要的修订目标有三点:

n         支持国际化编程,引入了支持国际字符集Unicode的数据类型和库函数;

n         修正原有版本的明显缺点。如整数的移植方法,例如int8_tint16_tint32_tint64_t等类型;

n         针对科学和工程的需要,改进计算的实用性。例如添加了复数类型和新数学函数。

2)具体修改

l     C99C89/C90的具体修改有:

n         增加了C++//注释风格:原来C语言之支持多行注释:/*……*/C99现在也识别单行注释:// ……

n         增加了关键字:inline(内联函数)、restrict(限制)、_Bool(布尔类型)、_Complex(复数)、_Imaginary(虚数)

u       内联函数(inline):链接时不是进行函数调用而是嵌入函数体代码(可减少调用的时间开销,适用于要求运行速度快的小型函数)

u       restrict:只能用于指针,表明该指针是数据对象的唯一且初始的方式(不是通过指针的赋值运算另外来得的),便于编译器进行代码优化。

附注:微软公司VC扩展的restrict,是让编译器限制别名(如用typedef定义的)的使用,必须类型名完全一致(只是类型等价还不够)时,类型检验才能通过

u       _Bool:布尔类型,为整数类型,一般用1(或非0)表示真、用0表示假。如果包含了C99新增加的标准库头文件stdbool.h,则可以用bool来代替_Bool,并可使用truefalse,从而与标准C++兼容

u       复数和虚数类型:

l         如果包含了C99新增加的标准库头文件complex.h后,就可以用complex来代替_Complex、用imaginary来代替_Imaginary

l         有三种复数和虚数类型:float _Complexdouble _Complexlong double _Complexfloat _Imaginarydouble _Imaginarylong double _Imaginary

l         C99内部,是用二元数组来实现复数的,第一个数组元素为实部、第二个数组元素为虚部

l         可以用实数和(定义在complex.h中的)I来初始化一个复变量。例如:

#include <complex.h>

double complex z = 6.0 – 8.5 * I, w = 3.0, u = 4.0 * I;

 

C99的关键字(Keywords)(共37个)

auto

enum

restrict

unsigned

break

extern

return

void

case

float

short

volatile

char

for

signed

while

const

goto

sizeof

_Bool

continue

if

static

_Complex

default

inline

struct

_Imaginary

do

int

switch

 

double

long

typedef

 

else

register

union

 

其中:黑色的为K&R C原有的关键字,绿色的为C90添加的关键字,红色的为C99新增的关键字。(C90删除了K&R C的关键字entry

 

n         增加了数据类型:(unsigned) long long [int]64位整数)(对应的打印输出格式为%lld%llu

n         定义了可移植整数类型:因为同一整数类型,在不同字长的计算机系统中,可能位数不一样,这给移植带来了问题。因此,C99在新增加的头文件inttypes.h中定义了已有整数类型的一些别名,便于程序移植。例如:int8_tint16_tint32_tint64_tuint8_tuint16_tuint32_tuint64_tintptr_tuintptr_t。以及表示对应类型常量的方法,例如INT8_C(128)INT32_C(1234)

n         增加了预定义宏:C99新加了两个预定义宏:__STDC_HOSTED__(是本机环境时为1,否则为0)和__STDC__VERSION__= 199901L 时为C99,否则为C89/C90

n         提供了一个预定义标识符:__func__,为一个代表函数名的字符串(该函数中包含有此标识符),该标识符具有函数作用域。(宏具有文件作用域)

n         增加了浮点常量的十六进制格式:pP表示后跟二进制指数(的十进制值)。例如:0xa.1cp10 = (10 + 1/16 + 12/256) * 210 = 10352.0

n         增加了浮点数的十六进制打印格式符:%a%A(代替十进制的%e%E)、%La%LA(代替十进制的%Le%LE

n

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值