版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、C 语言中 32 个关键字详解由 ANSI 标准定义的 C 语言关键字共 32 个 : auto double int struct break else long switch case enum register typedef char extern return union const float short unsigned continue for signed void default goto sizeof volatile do if while static 根据关键字的作用,可以将关键字分为数据类型关键字和流程控制关键字两大类。1 数据类型关键字A 基本数据类型( 5 个
2、)void :声明函数无返回值或无参数,声明无类型指针,显式丢弃运算结果 char :字符型类型数据,属于整型数据的一种int :整型数据,通常为编译器指定的机器字长float :单精度浮点型数据,属于浮点数据的一种 double :双精度浮点型数据,属于浮点数据的一种B 类型修饰关键字( 4 个)short:修饰int,短整型数据,可省略被修饰的 int。 long :修饰int,长整形数据,可省略被修饰的 int。sig ned:修饰整型数据,有符号数据类型 un sig ned:修饰整型数据,无符号数据类型C 复杂类型关键字( 5 个)struct:结构体声明 union :共用体声明
3、enum:枚举声明 typedef:声明类型别名sizeof :得到特定类型或特定类型变量的大小D 存储级别关键字( 6 个)auto :指定为自动变量,由编译器自动分配及释放。通常在栈上分配 static :指定为静态变量,分配在静态变量区,修饰函数时,指定函数作用域为文件内部register :指定为寄存器变量,建议编译器将变量存储到寄存器中使用,也可以修饰函数形 参,建议编译器通过寄存器而不是堆栈传递参数extern :指定对应变量为外部变量,即在另外的目标文件中定义, 可以认为是约定由另外文件声明的韵蟮囊桓觥耙 谩 ?con st:与volatile合称“ eV寺性”指定变量不可被当前
4、线程 /进程改变(但有可能被系统或 其他线程 /进程改变)volatile :与const合称“ eV寺性”指定变量的值有可能会被系统或其他进程/线程改变,强制编译器每次从内存中取得该变量的值2 流程控制关键字A 跳转结构( 4 个)return :用在函数体中,返回特定值(或者是void值,即不返回值)continue :结束当前循环,开始下一轮循环break :跳出当前循环或 switch结构goto :无条件跳转语句B 分支结构( 5 个)if :条件语句else :条件语句否定分支(与 if连用) switch :开关语句(多重分支语句) case:开关语句中的分支标记default:
5、开关语句中的 其他"分治,可选。C 循环结构( 3 个)for: for 循环结构, for(1;2;3)4; 的执行顺序为 1->2->4->3->2. 循环,其中 2 为循环条件do: do循环结构,do 1 while(2);的执行顺序是1->2->1循环,2为循环条件 while: while 循环结构, while(1) 2; 的执行顺序是 1->2->1.循环, 1 为循环条件 以上循环语句,当循环条件表达式为真则继续循环,为假则跳出循环。C99 和 C89 标准对比多了些什么1、restrict :指针类型修饰符C99 中
6、增加了公适用于指针的 restrict 类型修饰符, 它是初始访问指针所指对象的惟一途径, 因此只有借助 restrict 指针表达式才能访问对象。 restrict 指针指针主要用做函数变元,或者 指向由 malloc() 函数所分配的内存变量。 restrict 数据类型不改变程序的语义。如果某个函数定义了两个 restrict 指针变元, 编译程序就假定它们指向两个不同的对象,memcpy()函数就是restrict指针的一个典型应用示例。C89中memcpy()函数原型如下:代码:void *memcpy (void *s1, const void *s2, size_t size);
7、如果si和s2所指向的对象重叠,其操作就是未定义的。memcpy()函数只能用于不重叠的对象。C99中memcpy()函数原型如下:代码:void *memcpy(void *restrict s1, const void *restrict s2,size_t size);通过使用 restrict 修饰 s1 和 s2 变元,可确保它们在该原型中指向不同的对象。2、inline (内联)关键字内联函数除了保持结构化和函数式的定义方式外,还能使程序员写出高效率的代码 .函数的每次调用与返回都会消耗相当大的系统资源 ,尤其是当函数调用发生在重复次数很多的循 环语句中时 .一般情况下 ,当发生一
8、次函数调用时 ,变元需要进栈 ,各种寄存器内存需要保存 .当 函数返回时 ,寄存器的内容需要恢复。如果该函数在代码内进行联机扩展,当代码执行时, 这些保存和恢复操作旅游活动会再发生, 而且函数调用的执行速度也会大大加快。 函数的联 机扩展会产生较长的代码, 所以只应该内联对应用程序性能有显著影响的函数以及长度较短 的函数。3、新增数据类型_Bool值是 0 或 1。 C99 中增加了用来定义 bool、true 以及 false 宏的头文件夹 <stdbool.h> , 以便程序员能够编写同时兼容于 C与C+的应用程序。在编写新的应用程序时,应该使用 <stdbool.h&g
9、t; 头文件中的 bool 宏。_Complex and _ImaginaryC99 标准中定义的复数类型如下: float_Complex; float_Imaginary; double_Complex; double_Imaginary; long double_Complex; long double_Iplex.h头文件中定义了 complex和imaginary宏,并将它们扩展为 Complex和maginary, 因此在编写新的应用程序时 ,应该使用stdbool.h头文件中的complex和imag in ary宏。long long intC99 标准
10、中引进了 long long int ( -(2e63 - 1) 至 2e63 - 1)和 unsigned long long int ( 0 - 2e64 - 1)。 long long int 能够支持的整数长度为 64 位。4、对数组的增强可变长数组C99中,程序员声明数组时,数组的维数可以由任一有效的整型表达式确定,包括只在运行时才能确定其值的表达式 ,这类数组就叫做可变长数组 ,但是只有局部数组才可以是变长 的.可变长数组的维数在数组生存期内是不变的 ,也就是说 ,可变长数组不是动态的 .可以变化的 只是数组的大小 .可以使用 *来定义不确定长的可变长数组。数组声明中的类型修饰符在
11、C99中,如果需要使用数组作为函数变元, 可以在数组声明的方括号内使用 static关 键字, 这相当于告诉编译程序, 变元所指向的数组将至少包含指定的元素个数。 也可以在数 组声明的方括号内使用 restrict,volatile,const 关键字,但只用于函数变元。如果使用 restrict , 指针是初始访问该对象的惟一途径。 如果使用con st,指针始终指向同一个数组。使用volatile 没有任何意义。5、单行注释引入了单行注释标记”,可以象C+ 一样使用这种注释了。6、分散代码与声明7、预处理程序的修改a、变元列表宏可以带变元,在宏定义中用省略号( .)表示。内部预处理标识符
12、_VA_ARGS_ 决 定变元将在何处得到替换。 例:#define MySum(.) sum(_VA_ARGS_) 语句 MySum(k,m,n); 将被转换成: sum(k, m, n); 变元还可以包含变元。例:#define compare(compf, .) compf(_V A_ARGS_) 其 中 的 compare(strcmp,"small", "large"); 将 替 换 成 strcmp("small","large");b、_Pragma运算符C99 引入了在程序中定义编译指令的另外一种方
13、法: _Pragma 运算符。格式如下: _Pragma("directive")其中 directive 是要满打满算的编译指令。 _Pragma 运算符允许编译指令参与宏替换。c、内部编译指令STDCFP_CONTRACT ON/OFF/DEFAULT 若为ON,浮点表达式被当做基于硬件方式 处理的独立单元。默认值是定义的工具。STDCFEVN_ACCESS ON/OFF/DEFAULT 告诉编译程序可以访问浮点环境。默认值是 定义的工具。STDC CX_LIMITED_RANGE ON/OFF/DEFAULT 若值为 ON,相当于告诉编译程序某 程序某些含有复数的公式
14、是可靠的。默认是OFF。d、新增的内部宏_STDC_HOSTED_ 若操作系统存在,则为 1_STDC_VERSION_ 199991L 或更高。代表 C 的版本_STDC_IEC_599_ 若支持 IEC 60559 浮点运算,则为 1_STDC_IEC_599_COMPLEX_ 若支持 IEC 60599 复数运算,则为 1_STDC_ISO_10646_ 由编译程序支持,用于说明 ISO/IEC 10646 标准的年和月格式: yyymmmL8、for 语句内的变量声明C99 中,程序员可以在 for 语句的初始化部分定义一个或多个变量,这些变量的作用域 仅于本 for 语句所控制的循环
15、体内。比如:代码:for(int i=0; i<10; i+) / do someting .9、复合赋值C99 中,复合赋值中,可以指定对象类型的数组、结构或联合表达式。当使用复合 赋值时,应在括弧内指定类型, 后跟由花括号围起来的初始化列表;若类型为数组,则不能 指定数组的大小。建成的对象是未命名的。例: double *fp = (double) 1.1, 2.2, 3.3;该语句用于建立一个指向 double的指针fp,且该指针指向这个 3元素数组的第一个元 素。 在文件域内建立的复合赋值只在程序的整个生存期内有效。在模块内建立的复合赋值 是局部对象,在退出模块后不再存在。10、
16、柔性数组结构成员C99 中,结构中的最后一个元素允许是未知大小的数组,这就叫做柔性数组成员, 但结构中的柔性数组成员前面必须至少一个其他成员。 柔性数组成员允许结构中包含一个大 小可变的数组。 sizeof 返回的这种结构大小不包括柔性数组的内存。包含柔性数组成员的结 构用 malloc() 函数进行内存的动态分配,并且分配的内存应该大于结构的大小,以适应柔性 数组的预期大小。11、指定的初始化符C99 中,该特性对经常使用稀疏数组的程序员十分有用。 指定的初始化符通常有两种用 法:用于数组,以及用于结构和联合。用于数组的格式: index = vol; 其中, index 表示数 组的下标,
17、 vol 表示本数组元素的初始化值。例如:int x10 = 0 = 10, 5 = 30; 其中只有x0和x5得到了初始化.用于结构或 联合的格式如下:member-name(成员名称) 对结构进行指定的初始化时,允许采用简单的方法对结构中的指定成员进行初始化。例如: struct example int k, m, n; object = m = 10,n = 200; 其中,没有初始化k。对结构成员进行初始化的顺序没有限制。12、printf() 和 scanf() 函数系列的增强C99 中 printf()和 scanf()函数系列引进了处理 Io ng long int 和 un s
18、ig ned long long int 数据类型的特性。long long int类型的格式修饰符是ll。在printf()和scanf()函数中,ll适用 于d, i, o, u和x格式说明符。另外, C99还引进了 hh修饰符。当使用 d, i, o, u和x格式说 明符时,hh用于指定char型变元。ll和hh修饰符均可以用于 n说明符。格式修饰符a和A用在printf()函数中时,结果将会输出十六进制的浮点数。格式如下:-0xh, hhhhp + d使用A格式修饰符时,x和p必须是大写。A和a格式修饰符也可以用在 scanf()函数中,用于读取浮点数。调用printf()函数时,允许
19、在 %f说明符前加上I修饰符,即%lf,但不起作用。13、C99 新增的库C89 中标准的头文件<assert.h> 定义宏 assert()<ctype.h> 字符处理<errno.h> 错误报告<float.h> 定义与实现相关的浮点值勤<limits.h> 定义与实现相关的各种极限值<locale.h> 支持函数 setlocale()<math.h> 数学函数库使用的各种定义<setjmp.h> 支持非局部跳转<signal.h> 定义信号值<stdarg.h> 支持
20、可变长度的变元列表<stddef.h> 定义常用常数<stdio.h> 支持文件输入和输出<stdlib.h> 其他各种声明<string.h> 支持串函数<time.h> 支持系统时间函数C99 新增的头文件和库<complex.h> 支持复数算法<fenv.h> 给出对浮点状态标记和浮点环境的其他方面的访问<inttypes.h> 定义标准的、可移植的整型类型集合。也支持处理最大宽度整数的函数 <iso646.h> 首先在此 1995 年第一次修订时引进,用于定义对应各种运算符的宏&
21、lt;stdbool.h>支持布尔数据类型类型。定义宏bool,以便兼容于C+<stdint.h> 定义标准的、可移植的整型类型集合。该文件包含在 <inttypes.h> 中<tgmath.h> 定义一般类型的浮点宏<wchar.h> 首先在 1995 年第一次修订时引进,用于支持多字节和宽字节函数<wctype.h> 首先在 1995 年第一次修订时引进,用于支持多字节和宽字节分类函数14、 _func_ 预定义标识符用于指出 _func_所存放的函数名,类似于字符串赋值。15、其它特性的改动放宽的转换限制限制C89 标准
22、C99 标准数据块的嵌套层数15127条件语句的嵌套层数863内部标识符中的有效字符个数3163外部标识符中的有效字符个数631结构或联合中的成员个数1271023函数调用中的参数个数31127不再支持隐含式的 int 规则删除了隐含式函数声明对返回值的约束C99中,非空类型函数必须使用带返回值的return语句.扩展的整数类型扩展类型 含义int16_t 整数长度为精确 16 位int_least16_t 整数长度为至少 16 位 int_fast32_t 最稳固的整数类型 ,其长度为至少 32 位 intmax_t 最大整数类型uintmax_t 最大无符号整数类型对整数类型提升规则的改进
23、C89中,表达式中类型为 char,short int或int的值可以提升为int或unsigned int类型.C99中海种整数类型都有一个级别 例如:long long int的级别高于int, int的级别高 于 char 等.在表达式中 ,其级别低于 int 或 unsigned int 的任何整数类型均可被替换成 int 或 unsigned int 类型 此篇文章摘取与即将登载于 Dr.Dobb's软件研发第二期(2003年9月)的新的C语 言, C99 标准介绍 ,文章主要是介绍了 C99 的新特性,在得到作者 Randy Meyers 以及Dr.Dobb's软件
24、研发负责人刘江先生的应允下,把全文的前面的一部分作为文档发表, 希望能对大家有所帮助。译注2:C语言的产生源于失败的项目-Multics。从70年代初期的早期 C语言到后来的K&RC, ANSI C,C89,在将近20年中C语言多次发展演化,一直到 1999年C语言又重新定 案,成为新的 C语言标准。这篇文章发表在CUJ Octorber 2000 V18 N10,当时C99标准刚刚公布一年, C 社区正急需正统的声音。本文作者 Randy Meyers 作为标准委员会委员,在 CUJ 杂志开了一个专题系列 The New C 用来讨论新标准的新特性,本文就是其中的第一篇。 本文从全局
25、上介绍了新标准C,尤其是一些增加的特性,期望本文能给关心 C语言和使用C语言的用户带来帮助。 在翻译上, 所有译者在翻译过程中有疑惑的术语或者其他一切都以括 号形式把原文直接给出, 诚心不想给读者半点误导, 但是否如愿还需读者的评判, 关于本文 的一切可以用 amstrongest 与译者联系和讨论。C99很像C89,很多地方是一致的,但更多的却是不同。简介你可能没有注意到,针对 ANSI/ISO C 的主要的修订版 1 在去年 12 月已经被核准通过, 那是就C99。同样的,你可能也没注意到,其实你已经在使用这个新的C语言了,或者至少用到它的一部分。这需要归功于标准委员会在接受新特性到C 语
26、言的过程中采取了恰当而保守的方式。差不多所有的新特性早已经被实现并且在现存的一些 C 编译器 (impletmentations )中证明了其存在的价值。虽然没有编译器能保证全部的C99 特性,但其中许多在很多年前就实现了C99中不同的部分。这对于C程序员来说将是个好消息。或许你曾经为了保证程序的可移植性而在你喜爱的编译器里避免使用一些独立的特性,但现在如果这些特性是 C99 中的一部分的话,你可以放心的使用这些特性,因为他们将在大部分 遵守 C99 标准的编译器中被保证。毫无疑问,新标准是向上兼容旧的,当然也会有些不兼 容地方, 但这些都是非常少而次要的。 标准委员会非常努力地工作就是为了将
27、和老版本的兼 容性问题所带来的影响减少到最小。从后面讨论到的关键字你可以看到这方面的例证。命名和历史程序设计语言随着时间在不断演进, 语言的命名方式不仅仅依赖于语言本身的名字, 还结合 了它们被定义的年代。(回到五年前, ALGOL 68, C89, Fortran 77 还有 Fortran 4 ,我对这些 名字真的感到好笑,如今这些令人讨厌的命名方式还带来了千年虫问题,04 将无法区别眼前的2004或者久远的1904)。新的C语言和定义它的新标准被称为C99,而原来的C语言标准2被称为C89或者C90( ANSI在1989年公布了标准文档而 ISO在1990年重新编排了 标准文档章节后才公
28、布) 。如果你在自己的程序中处理过日语,韩语,或者中文的文字问题 你也许会知道对于 C89来说曾经有一次小的升级3被称为C95,这次升级主要是加入了更多的用来处理多字节和宽字节字符(wide and multibyte characters )的库函数 (Java 的倡导者曾经错误的宣布Java是第一个支持大字符集合的语言,其实这样的支持在C89中就已经存在了)。对于C99施加影响最大的或许就是数值C语言扩展小组(Numerical C Extensions Group, orNCEG.)。NCEG是ANSI C标准委员会J11的一个子委员会,他们主要在C89完成后从事技术报告工作4。NCEG
29、的技术报告不是标准,它只是号召编译器实现者来体会并且得到 那些一系列描叙清楚的语言特性的经验。这些扩展中大的部分是用来处理C 语言数值编程的(IEEE arithmetic, complex numbers),但是还有一些是为了其他一般目标或者性能的提升和 优化(变长数组,并行处理, restrict 关键字)。NCEG 的扩展一些是由子标准委员会首次定义的, 而其他一些则是根据编译器厂商对于已经 实现的特性的反馈而重新定义的。 所以技术报告不是标准, 编译器厂商可以自由的选取并且 实现这些扩展,甚至可以根据用户的经验更改这些扩展。真实世界的需求是非常有价值的。语言的不同特性在内部会以一种令人
30、吃惊的方式相互作 用,而有的特性将会给程序的运行效率带来不良影响, 即使这些特性永远都不会被用到 (举 例来说,在一些C+的实现中,使用少量多继承的程序将会比只使用单继承的程序慢一些)。NCEG 的扩展实验不仅仅是为了改进扩展本身, 同时是为了改进它们的规格, 并且让标准委 员会对于那些已知的语言特性的内部作用和价值保持信心。哪些不属于 C99并不是所有的 NCEG 扩展都被 C99 所接受,其中最大的例子也许就是 NCEG 对并行处理的 支持并没有被 C99 所接受。这些并行处理是基于 Thinking Machines 上的 C* 语言(读作 C-Star )的。并行计算机制造商为了能让程
31、序员写出清晰的并行程序代码而做出许多不同的 扩展特性,而 NCEG 技术报告对此却没有做出改进,所以仍然没有一致的并且是最好的方 式在并行计算机上编程。因此,这样的特性是不适合被标准C语言接受的。另外一些NCEG扩展在被加入到 C99 之前做了一些更改。 NCEG 支持的复数包含分开的虚数数据类型(separate imaginary datatypes)o 比如,double_ imaginary 数据类型。但是在 C99 中虚数数据 类型却是可选择的。然而,被考虑得最多到最后却没有被C99采纳的特性不是来自NCEG,而是C+。在将近一年的时间里, 标准委员会一直在从事 C +中的子集 -面
32、向对象特性的研究工作。这个子集有点像80年代末的C+特性的混合,包括单继承(非多继承),虚函数,成员访问控制(公 有,私有,保护),构造函数,析构函数。如果新的C语言与早期的C+相似可以说是既有进步也有退步。积极的一面是,这些特性对于初期 C+的流行起到了巨大作用, 到现在这些 特性的价值和它们之间的内在作用已经被大家很好的理解,而且已经证明它们是可以共存 的。然而,消极的一面是“9(年代的C+是否可以看作是80年代的C+的自然演化?如果是,C采用80年代的C+的特性价值何在?要知道我们已经拥有90年代的C+ 了。”最终,多方面的原因,包括一些逻辑上的,让标准委员会拒绝把面向对象特性加入到C
33、语言中去。Randy Meyers is consultant providing training and mentoring in C, C+, and Java. He is the current chair of J11, the ANSI C committee, and previously was a member of J16 (ANSI C+) and the ISO Java Study Group. He worked on compilers for Digital Equipment Corporation for 16 years and was Project
34、Architect for DEC C and C+. He can be reached at rmeyers.新的 C 语言: C99 标准介绍Randy Meyers此篇文章摘取与即将登载于 Dr.Dobb's 软件研发第二期( 2003年9月)的新的 C 语 言, C99 标准介绍 ,文章主要是介绍了C99 的新特性,在得到作者 Randy Meyers 以及 Dr.Dobb's 软件研发负责人刘江先生的应允下,把全文的前面的一部分作为文档发表, 希望能对大家有所帮助。译注 2:C 语言的产生源于失败的项目 -Multics 。从 70 年代初期的早期 C 语言到后来的
35、 K&R C, ANSI C, C89,在将近20年中C语言多次发展演化,一直到 1999年C语言又重新定 案,成为新的 C语言标准。这篇文章发表在CUJ Octorber 2000 V18 N10,当时C99标准刚刚公布一年, C 社区正急需正统的声音。本文作者 Randy Meyers 作为标准委员会委员,在 CUJ 杂志开了一个专题系列 The New C 用来讨论新标准的新特性,本文就是其中的第一篇。 本文从全局上介绍了新标准C,尤其是一些增加的特性,期望本文能给关心 C语言和使用C语言的用户带来帮助。 在翻译上, 所有译者在翻译过程中有疑惑的术语或者其他一切都以括 号形式把原
36、文直接给出, 诚心不想给读者半点误导, 但是否如愿还需读者的评判, 关于本文 的一切可以用 amstrongest 与译者联系和讨论。C99很像C89,很多地方是一致的,但更多的却是不同。简介你可能没有注意到,针对 ANSI/ISO C 的主要的修订版 1 在去年 12 月已经被核准通过, 那是就C99。同样的,你可能也没注意到,其实你已经在使用这个新的C语言了,或者至少用到它的一部分。这需要归功于标准委员会在接受新特性到C 语言的过程中采取了恰当而保守的方式。 差不多所有的新特性早已经被实现并且在现存的一些 C 编译器 (impletmentations )中证明了其存在的价值。虽然没有编译
37、器能保证全部的C99 特性,但其中许多在很多年前就实现了C99中不同的部分。这对于C程序员来说将是个好消息。或许你曾经为了保证程序的可移植性而在你喜爱的编译器里避免使用一些独立的特性,但现在如果这些特性是 C99 中的一部分的话,你可以放心的使用这些特性,因为他们将在大部分 遵守 C99 标准的编译器中被保证。毫无疑问,新标准是向上兼容旧的,当然也会有些不兼 容地方, 但这些都是非常少而次要的。 标准委员会非常努力地工作就是为了将和老版本的兼 容性问题所带来的影响减少到最小。从后面讨论到的关键字你可以看到这方面的例证。命名和历史程序设计语言随着时间在不断演进, 语言的命名方式不仅仅依赖于语言本
38、身的名字, 还结合 了它们被定义的年代。 (回到五年前, ALGOL 68, C89, Fortran 77 还有 Fortran 4 ,我对这些名字真的感到好笑,如今这些令人讨厌的命名方式还带来了千年虫问题, 04 将无法区别眼 前的 2004 或者久远的 1904)。新的 C 语言和定义它的新标准被称为C99 ,而原来的 C 语言标准2被称为C89或者C90( ANSI在1989年公布了标准文档而 ISO在1990年重新编排了 标准文档章节后才公布) 。如果你在自己的程序中处理过日语,韩语,或者中文的文字问题 你也许会知道对于 C89来说曾经有一次小的升级3被称为C95,这次升级主要是加入
39、了更 多的用来处理多字节和宽字节字符(wide and multibyte characters)的库函数(Java的倡导者曾经错误的宣布Java是第一个支持大字符集合的语言,其实这样的支持在C89中就已经存在了)。对于 C99 施加影响最大的或许就是数值 C 语言扩展小组( Numerical C Extensions Group, or NCEG.)。NCEG是ANSI C标准委员会J11的一个子委员会,他们主要在C89完成后从事技术报告工作 4 。 NCEG 的技术报告不是标准,它只是号召编译器实现者来体会并且得到 那些一系列描叙清楚的语言特性的经验。这些扩展中大的部分是用来处理C 语言
40、数值编程的(IEEE arithmetic, complex numbers),但是还有一些是为了其他一般目标或者性能的提升和 优化(变长数组,并行处理, restrict 关键字)。NCEG 的扩展一些是由子标准委员会首次定义的, 而其他一些则是根据编译器厂商对于已经 实现的特性的反馈而重新定义的。 所以技术报告不是标准, 编译器厂商可以自由的选取并且 实现这些扩展,甚至可以根据用户的经验更改这些扩展。真实世界的需求是非常有价值的。语言的不同特性在内部会以一种令人吃惊的方式相互作 用,而有的特性将会给程序的运行效率带来不良影响, 即使这些特性永远都不会被用到 (举 例来说,在一些C+的实现中
41、,使用少量多继承的程序将会比只使用单继承的程序慢一些)。NCEG 的扩展实验不仅仅是为了改进扩展本身, 同时是为了改进它们的规格, 并且让标准委 员会对于那些已知的语言特性的内部作用和价值保持信心。哪些不属于 C99并不是所有的 NCEG 扩展都被 C99 所接受,其中最大的例子也许就是 NCEG 对并行处理的 支持并没有被 C99 所接受。这些并行处理是基于 Thinking Machines 上的 C* 语言(读作 C-Star )的。并行计算机制造商为了能让程序员写出清晰的并行程序代码而做出许多不同的 扩展特性,而 NCEG 技术报告对此却没有做出改进,所以仍然没有一致的并且是最好的方
42、式在并行计算机上编程。因此,这样的特性是不适合被标准C语言接受的。另外一些NCEG扩展在被加入到 C99 之前做了一些更改。 NCEG 支持的复数包含分开的虚数数据类型(separate imaginary datatypes)o 比如,double_ imaginary 数据类型。但是在 C99 中虚数数据 类型却是可选择的。然而,被考虑得最多到最后却没有被C99采纳的特性不是来自 NCEG,而是C+。在将近一年的时间里, 标准委员会一直在从事 C +中的子集 -面向对象特性的研究工作。这个子集有点像80年代末的C+特性的混合,包括单继承(非多继承),虚函数,成员访问控制(公 有,私有,保护
43、),构造函数,析构函数。如果新的C语言与早期的C+相似可以说是既有进步也有退步。积极的一面是,这些特性对于初期 C+的流行起到了巨大作用,到现在这些特性的价值和它们之间的内在作用已经被大家很好的理解,而且已经证明它们是可以共存 的。然而,消极的一面是“90年代的C+是否可以看作是80年代的C+的自然演化?如果是,C采用80年代的C+的特性价值何在?要知道我们已经拥有 90年代的C+ 了。”最终, 多方面的原因,包括一些逻辑上的,让标准委员会拒绝把面向对象特性加入到C 语言中去。本 文 来 自 CSDN 博 客 , 转 载 请 标 明 出 处 : c99 是在 c89 的基础上发展起来的,增加了
44、基本数据类型,关键字和一些系统函数等。其 实在初学阶段 C89( ANSI C )和C99的区别是不易察觉的,所以不必太在意这个。C99 有一部分是对于大字符集的优化(很多资料上写的是 ANSI 标准化),还加入了一 些数据库函数,是 C89之后的标准,我们用的C是C89标准的,C+是C89编写的,目前的 C99 标准其实在以前的编译器中就或多或少的支持了, 目前完全支持的有这些: MinGW 、 Borland C+ 、dev-C+ 。C99 标准的新特性在ANSI标准化后,C语言的标准在一段相当的时间内都保持不变,尽管C+继续在改进。(实际上, Normative Amendment1 在
45、 1995 年已经开发了一个新的 C 语言版本。但是这 个版本很少为人所知。 )标准在 90 年代才经历了改进, 这就是 ISO9899:1999 (1999 年出版)。 这个版本就是通常提及的C99。它被ANSI于2000年3月采用。在 C99 中包括的特性有:对编译器限制增加了, 比如源程序每行要求至少支持到 4095 字节, 变量名函数名的要 求支持到 63 字节 (extern 要求支持到 31) 。预处理增强了。例如:宏支持取参数 #define Macro(.) _V A_ARGS_使用宏的时候,参数如果不写,宏里用#, # 这样的东西会扩展成空串。 (以前会出错的)支持 / 行注
46、释(这个特性实际上在 C89 的很多编译器上已经被支持了)增加了新关键字 restrict , inline , _Complex , _Imaginary , _Bool 支持 long long , long double _Complex , float _Complex 这样的类型 支持 <: :> <% %> %: %:%: ,等等奇怪的符号替代, D&E 里提过这个 支持了不定长的数组。数组的长度就可以用变量了。声明类型的时候呢,就用 int a这样的写法。不过考虑到效率和实现,这玩意并不是一个新类型。所以就不能用在全局 里,或者 struct un
47、ion 里面,如果你用了这样的东西, goto 语句就受限制了。变量声明不必放在语句块的开头, for 语句提倡这么写 for(int i=0;i<100;+i) 就是说, int i 的声明放在里面, i 只在 for 里面有效。 (VC 没有遵守这条标准, i 在 for 外也有效; 但 vc2005 里已经默认是 i 在外面不可见了,但有编译选项可以设置。 )当一个类似结构的东西需要临时构造的时候,可以用(type_name)xx,xx,xx 这有点像C+ 的构造函数初始化结构的时候现在可以这样写:struct int a3, b; hehe = 0.a = 1, 1.a = 2
48、;struct int a, b, c, d; hehe = .a = 1, .c = 3, 4, .b = 5 / 3, 4 是对 .c, .d 的赋值字符串里面, u 支持 unicode 的字符支持 16 进制的浮点数的描述所以 printf 和 scanf 的格式化串多了支持 ll / LL (VC6 里用的 I64) 对应新的 long long 类型。浮点数的内部数据描述支持了新标准,这个可以用 #pragma 编译器指定 除了已经有的 _line_ _file_ 以外,又支持了一个 _func_ 可以得到当前的函数名 对于非常数的表达式,也允许编译器做化简修改了对于 / % 处理
49、负数上的定义, 比如老的标准里-22 / 7 = -3 ,-22 % 7 = -1 而现在-22 / 7 = -4 , -22 % 7 = 6取消了不写函数返回类型默认就是 int 的规定 允许 struct 定义的最后一个数组写做 不指定其长度描述 const const int i; 将被当作 const int i; 处理 增加和修改了一些标准头文件。比如定义 bool 的 <stdbool.h> ,定义一些标准长度的 int 的 <inttypes.h> ,定义复数的 <complex.h> 定义宽字符的 <wctype.h> 有点泛型味
50、道的 数学函数 <tgmath.h> 跟浮点数有关的 <fenv.h> 。 <stdarg.h> 里多了一个 va_copy 可以复 制 . 的参数。 <time.h> 里多了个 struct tmx 对 struct tm 做了扩展输入输出对宽字符还有长整数等做了相应的支持 相对于 c89 的变化还有1、增加 restrict 指针C99 中增加了公适用于指针的 restrict 类型修饰符,它是初始访问指针所指对象的惟一 途径, 因此只有借助 restrict 指针表达式才能访问对象。 restrict 指针指针主要用做函数变元, 或者指向由
51、 malloc() 函数所分配的内存变量。 restrict 数据类型不改变程序的语义。 如果某个函数定义了两个 restrict 指针变元, 编译程序就假定它们指向两个不同的对象, memcpy()函数就是restrict指针的一个典型应用示例。C89中memcpy()函数原型如下:代码 : void *memcpy (void *s1, const void *s2, size_t size);如果si和s2所指向的对象重叠,其操作就是未定义的。memcpy()函数只能用于不重叠的对象。C99 中 memcpy()函数原型如下:代码 :void *memcpy(void Restrict
52、si, const void *restrict s2,size_t size);通过使用 restrict 修饰 si 和 s2 变元,可确保它们在该原型中指向不同的对象。2、inline (内联)关键字 内联函数除了保持结构化和函数式的定义方式外, 还能使程序员写出高效率的代码。 函数的每次调用与返回都会消耗相当大的系统资源, 尤其是当函数调用发生在重复次数很多的 循环语句中时。 一般情况下,当发生一次函数调用时,变元需要进栈, 各种寄存器内存需要 保存。 当函数返回时,寄存器的内容需要恢复。如果该函数在代码内进行联机扩展,当代码 执行时,这些保存和恢复操作旅游活动会再发生,而且函数调用的
53、执行速度也会大大加快。 函数的联机扩展会产生较长的代码, 所以只应该内联对应用程序性能有显著影响的函数以及 长度较短的函数。3、新增数据类型 _Bool值是0或1。C99中增加了用来定义 bool、true以及false宏的头文件夹<stdbool.h>,以 便程序员能够编写同时兼容于C与C+的应用程序。在编写新的应用程序时,应该使用<stdbool.h>头文件中的bool宏。_Complex and _ImaginaryC99 标准中定义的复数类型如下: float_Complex ;float_Imaginary ;double_Complex ; double_I
54、maginary ; long double_Complex ;long double_Imaginary 。<complex.h> 头文件中定义了 complex 和 imaginary 宏,并将它们扩展为 _Complex 和 _Imaginary ,因此在编写新的应用程序时,应该使用<stdbool.h> 头文件中的 complex 和imaginary 宏。long long intC99 标准中引进了 long long int( -(2e63 - 1)至 2e63 - 1)和 unsigned long long int( 0 - 2e64- 1)。 lon
55、g long int 能够支持的整数长度为 64 位。4、对数组的增强可变长数组C99 中, 程序员声明数组时, 数组的维数可以由任一有效的整型表达式确定, 包括只在 运行时才能确定其值的表达式, 这类数组就叫做可变长数组, 但是只有局部数组才可以是变 长的。可变长数组的维数在数组生存期内是不变的, 也就是说, 可变长数组不是动态的。 可以 变化的只是数组的大小。可以使用 * 来定义不确定长的可变长数组。数组声明中的类型修饰符在 C99 中,如果需要使用数组作为函数变元, 可以在数组声明的方括号内使用 static 关 键字, 这相当于告诉编译程序, 变元所指向的数组将至少包含指定的元素个数。
56、 也可以在数 组声明的方括号内使用 restrict ,volatile ,const 关键字,但只用于函数变元。 如果使用 restrict , 指针是初始访问该对象的惟一途径。如果使用con st,指针始终指向同一个数组。使用volatile没有任何意义。5、单行注释引入了单行注释标记”,可以像C+ 样使用这种注释了。6、分散代码与声明7、预处理程序的修改a、变元列表宏可以带变元,在宏定义中用省略号(.)表示。内部预处理标识符_VA_ARGS_ 决定变元将在何处得到替换。例:#define MySum(.) sum(_VA_ARGS_) 语句 MySum(k,m,n);将被转换成: sum
57、(k, m, n); 变元还可以包含变元。例: #define compare(compf, .) compf(_VA_ARGS_) 其 中 的 compare(strcmp,"small", "large"); 将 替 换 成 : strcmp("small","large");b、_Pragma 运算符C99引入了在程序中定义编译指令的另外一种方法:_Pragma运算符。格式如下:_Pragma("directive")其中directive是要满打满算的编译指令。_Pragma运算符允许编
58、译指令参与宏替换。c、内部编译指令STDCFP_CONTRACT ON/OFF/DEFAULT 若为ON,浮点表达式被当做基于硬件方式 处理的独立单元。默认值是定义的工具。STDCFEVN_ACCESS ON/OFF/DEFAULT 告诉编译程序可以访问浮点环境。默认值是 定义的工具。STDC CX_LIMITED_RANGE ON/OFF/DEFAULT 若值为 ON,相当于告诉编译程序某 程序某些含有复数的公式是可靠的。默认是 OFF。d、新增的内部宏_STDC_HOSTED_ 若操作系统存在,则为 1_STDC_VERSION_ 199991L 或更高。代表 C 的版本_STDC_IEC_599_ 若支持 IEC 60559 浮点运算,则为 1_STDC_IEC_599_COMPLEX_
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025无锡商业职业技术学院教师招聘考试题目及答案
- 2025成都银杏酒店管理学院教师招聘考试题目及答案
- 辽宁中医考研试题及答案
- 2025年蚌埠市淮上区法院书记员招聘笔试试题及答案解析
- 2026年中国科学技术大学附属中学实验学校教师招聘4名建设考试参考试题及答案解析
- 2026北京师范大学实验华夏女子中学新教师招聘建设笔试备考题库及答案解析
- 九江万富商砼有限公司2026年度劳务派遣人员招聘建设考试备考试题及答案解析
- 2026年度南平松溪县“校园行”紧缺急需学科专业教师招聘(福建师范大学专场)建设考试参考题库及答案解析
- 2026年枣庄市山亭区公开招聘教师(43名)建设笔试备考试题及答案解析
- 2026江苏徐州生物工程职业技术学院招聘高层次人才11人建设考试参考试题及答案解析
- 动力配电箱安装课件
- 索尼摄像机DCR-HC21E说明书
- 中国天眼简介
- 脑血管介入科进修汇报
- DB3205∕T 1096-2023 智能网联汽车测试驾驶员能力要求
- 卡迪滚筒洗衣机 GO4 DF86说明书
- 荆门市东宝区社区工作者招聘笔试真题2024
- DB64∕ 266-2018 建筑工程资料管理规程
- 财务软件使用管理制度
- 2024年江苏省南京市事业单位考试《综合知识和能力素质》真题库及答案
- 厦门市湖里区离婚协议书
评论
0/150
提交评论