C99标准的新特性

合集下载

C99标准的新特性

C99标准的新特性

C99标准的新特性C语⾔标准的发展C语⾔的发展历史⼤致上分为4个阶段:Old Style C、C89、C99和C11.C89是最早的C语⾔规范,于1989年提出,1990年先由ANSI(美国国家标准委员会,American National Standards Institute)推出ANSI版本,后来被接纳为ISO国际标准(ISO/IEC9899:1990),因⽽有时也称为C90,最经典的C语⾔教材[K&R]就是基于这个版本的,C89是⽬前最⼴泛采⽤的C语⾔标准,⼤多数编译器都完全⽀持C89,C99(ISO/IEC9899:1999)是在1999年推出的,加⼊了许多新的特性,但⽬前仍没有得到⼴泛⽀持,在C99推出之后相当长的⼀段时间⾥,连gcc也没有完全实现C99的所有特性。

2011年12⽉8号,ISO 发布了新的 C 语⾔的新标准——C11,之前被称为C1X,官⽅名称 ISO/IEC 9899:2011。

现在介绍⼀下C99相对于C89或者ANSI C的新特性:1.复数(complex)complex.h是C标准函数库中的头⽂件,提供了复数算术所需要的宏定义与函数声明。

#define complex _Complex#define _Complex_I ((const float _Complex)__I__)#define I _Complex_IC99规定了关键字_Complex。

因⽽有3种复数类型:double _Complexfloat _Complexlong double _Complex次序不是必须遵守的,⽐如float _Complex也可以写成_Complex float。

_Complex_I扩展为类型为const float _Complex的常量值,其值为虚数单位。

C99规定complex作为宏扩展为_Complex。

但C++未定义complex宏。

gcc仅⽀持complex type,不⽀持imaginary type。

C99标准介绍

C99标准介绍

C99标准介绍标准介绍2007年07月20日 星期五 19:46新的C语言: C99标准介绍此篇文章摘取与即将登载于《Dr.Dobb's 软件研发》》第二期(2003年9月)的《新的C语言,C99标准介绍》,文章主要是介绍了C99的新特性,在得到作者Randy Meyers以及《Dr.Dobb's 软件研发》》负责人刘江先生的应允下,把全文的前面的一部分作为文档发表,希望能对大家有所帮助。

译注2:C语言的产生源于失败的项目---Multics。

从70年代初期的早期C语言到后来的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语言的用户带来帮助。

在翻译上,所有译者在翻译过程中有疑惑的术语或者其他一切都以括号形式把原文直接给出,诚心不想给读者半点误导,但是否如愿还需读者的评判,关于本文的一切可以用amstrongest@与译者联系和讨论。

C99很像C89,很多地方是一致的,但更多的却是不同。

简介你可能没有注意到,针对ANSI/ISO C的主要的修订版[1] 在去年12月已经被核准通过,那是就C99。

同样的,你可能也没注意到,其实你已经在使用这个新的C语言了,或者至少用到它的一部分。

这需要归功于标准委员会在接受新特性到C语言的过程中采取了恰当而保守的方式。

差不多所有的新特性早已经被实现并且在现存的一些C编译器(im p letmentations)中证明了其存在的价值。

C99标准的新特性

C99标准的新特性

C99标准的新特性Duanchangzhi 2010-6-29 先简单介绍下C语言的标准.C语言的发展历史大致上分为三个阶段:Old Style C、C89和C99.Ken Thompson和Dennis Ritchie发明C语言时有很多语法和现在并不一样,但为了向后兼容性(Backward Compatibility), 这些语法仍然在C89和C99中保留下来了.C89是最早的C语言规范,于1989年提出,1990年先由ANSI(美国国家标准委员会,American National Standards Institute)推出ANSI版本,后来被接纳为ISO国际标准(ISO/IEC 9899:1990),因而有时也称为C90,最经典的C语言教材[K&R]就是基于这个版本的,C89是目前最广泛采用的C语言标准,大多数编译器都完全支持C89.C99标准(ISO/IEC 9899:1999)是在1999年推出的,加入了许多新的特性,但目前仍没有得到广泛支持,在C99推出之后相当长的一段时间里,连gcc也没有完全实现C99的所有特性.现在介绍一下C99相对于C89或者ANSI C的特性.1、增加restrict指针C99中增加了适用于指针的restrict类型修饰符,它是初始访问指针所指对象的惟一途径,因此只有借助restrict指针表达式才能访问对象.restrict指针主要用做函数形参,或者指向由malloc()函数所分配的内存变量.restrict数据类型不改变程序的语义.如果某个函数定义了两个restrict指针形参,编译程序就假定它们指向两个不同的对象,memcpy()函数就是restrict指针的一个典型应用示例.C89中memcpy()函数原型如下:void *memcpy (void *s1, const void *s2, size_t size);如果s1和s2所指向的对象重叠,其操作就是未定义的.memcpy()函数只能用于不重叠的对象.C99中memcpy()函数原型如下:void *memcpy(void *restrict s1, const void *restrict s2,size_t size); 通过使用restrict修饰s1和s2参数,可确保它们在该原型中指向不同的对象.2、inline(内联)关键字内联函数除了保持结构化和函数式的定义方式外,还能使程序员写出高效率的代码.函数的每次调用与返回都会消耗相当大的系统资源,尤其是当函数调用发生在重复次数很多的循环语句中时.一般情况下,当发生一次函数调用时,函数与参数需要进栈,各种寄存器内存需要保存.当函数返回时,寄存器的内容需要恢复,如果该函数在代码内进行内联扩展,当代码执行时,这些保存和恢复操作不会再发生,因为没有函数的进栈与退栈了,而且函数调用的执行速度也会大大加快,函数的内联扩展会产生较长的代码,所以只应该内联对应用程序性能有显著影响的函数以及长度较短的函数,即短小精悍且多次调用的函数.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_Imaginary;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),long long int能够支持的整数长度为64位.4、对数组的增强可变长数组(VLA)C99中,程序员声明数组时,数组的维数可以由任一有效的整型表达式确定,包括只在运行时才能确定其值的表达式,这类数组就叫做可变长数组.但是只有局部数组才可以是变长的.可变长数组的维数在数组生存期内是不变的,也就是说,可变长数组不是动态的.可以变化的只是数组的大小.可以使用*来定义不确定长的可变长数组.在栈中分配VLA 时,仿佛调用了alloca 函数。

c语言标准 c99

c语言标准 c99

c语言标准 c99C语言标准 C99。

C语言标准C99是C语言的第三个正式标准,于1999年制定。

C99标准对C 语言进行了一系列的修订和扩充,引入了一些新的特性,提高了语言的表达能力和编程效率。

本文将对C99标准进行全面介绍,包括新增的特性、语法规范和编程实践等内容。

一、新增特性。

C99标准引入了许多新的特性,其中最重要的包括:1. 布尔类型(_Bool),C99标准新增了_Bool类型,用于表示真(true)和假(false)。

2. 复数类型(_Complex),C99标准引入了复数类型,支持复数运算和复数常量。

3. 可变参数宏(variadic macros),C99标准允许宏接受可变数量的参数,使得宏的使用更加灵活。

4. 行注释(//),C99标准支持C++风格的行注释,方便程序员进行注释和调试。

二、语法规范。

C99标准对C语言的语法进行了一些修改和扩充,主要包括:1. 新的关键字,C99标准引入了一些新的关键字,如inline、restrict等,用于支持新的特性和优化编译器的性能。

2. 变长数组,C99标准允许在数组的声明和定义中使用变量作为数组的大小,提高了数组的灵活性。

3. 新的数据类型,C99标准引入了一些新的数据类型,如int8_t、uint8_t等,用于表示固定大小的整数类型。

三、编程实践。

在使用C99标准进行编程时,需要注意一些编程实践,以提高代码的可读性和可维护性:1. 使用新特性,充分利用C99标准引入的新特性,如布尔类型、复数类型等,可以使代码更加清晰和高效。

2. 规范命名,遵循统一的命名规范,使用有意义的变量名和函数名,提高代码的可读性。

3. 注重注释,在代码中添加必要的注释,解释关键逻辑和算法,方便他人理解和维护代码。

4. 避免依赖,尽量避免依赖特定的编译器或平台特性,以提高代码的可移植性和兼容性。

四、总结。

C语言标准C99为C语言带来了许多新的特性和改进,使得C语言在表达能力和编程效率上有了显著的提高。

c 调用c99编译

c 调用c99编译

c 调用c99编译C语言是一种广泛应用于系统编程和嵌入式开发的中级编程语言,而C99则是C语言的一个标准版本。

本文将介绍如何在C代码中调用C99编译器,以及一些相关的注意事项和技巧。

在开始讨论C调用C99编译之前,我们需要明确两者的概念和区别。

C语言是一种通用的高级编程语言,它提供了良好的性能和灵活性,因此被广泛应用于各种领域。

而C99是C语言的一个标准版本,它在C89的基础上进行了扩展和改进,引入了一些新特性和语法。

要在C代码中调用C99编译器,我们可以按照以下步骤操作:(1)在代码中使用C99的语法和特性。

C99引入了一些新特性,如变长数组、复合字面量、内联函数等,我们可以在代码中灵活运用它们。

(2)选择对应的C99编译器。

常见的C99编译器有GCC、Clang 等,我们可以根据自己的需求选择适合的编译器。

(3)使用编译器提供的选项启用C99支持。

不同的编译器在启用C99支持的方式上可能有所不同,可以通过命令行选项或在代码中使用特定的预处理宏来启用C99支持。

(4)进行编译和链接操作。

将包含C99语法的代码文件编译成可执行文件或库文件,并进行链接操作以生成最终的可执行程序或库文件。

3. 注意事项和技巧在C调用C99编译的过程中,我们需要注意以下几点:(1)不同编译器的支持情况可能会有所差异。

虽然C99标准已经发布多年,但某些编译器可能对其支持并不完整,请根据目标平台和需求选择合适的编译器。

(2)在使用C99特性时,要注意兼容性问题。

某些C99特性可能不被其他C语言标准支持,如果代码需要在不同的编译环境中运行,则需要谨慎选择和使用特性。

(3)合理使用C99特性可以提高代码的可读性和效率。

C99引入的一些特性可以简化代码的编写和维护,同时提高代码的执行效率,我们可以根据具体情况灵活运用。

通过本文的介绍,我们了解了C调用C99编译的方法和注意事项。

在实际开发中,正确地使用C99特性可以提高代码的质量和效率,但需要注意不同编译器的支持情况和兼容性问题。

07.C语言重要知识点

07.C语言重要知识点

C语言重要知识点1.C程序的基本特征a)C语言的特点(了解)b)C程序的结构特点i.由函数构成,函数包含函数声明(返回类型、函数名、参数列表)和函数体ii.可执行程序的入口---main()函数iii.函数体中的语句用分号隔开iv.可以写注释(/*…*/和//,后者是C99中引入的)v.编译预处理指令(#include包含头文件<>和””(二者的区别),常用的头文件)c)C程序的开发步骤---目标→设计→编辑→编译→运行→测试/调试→修改/维护i.从filename.c生成filename.exe的过程1.编译(compile):生成目标代码(obj)2.链接(link):访问静态库(lib)和启动(start-up)代码,生成exeii.两种类型的库:1.LIB ---静态库(链接时加载到程序中)2.DLL---动态链接库(链接时保留接口,调用时加载)2.C的基本的语言元素a)关键字i.常用关键字1.类型:char、short、int、long、float、double、enum、struct、union、void、、typedef、unsigned2.循环/分支:if、else、switch、case、default、for、while、do、break、continue3.其他:static、return、sizeofii.不常用关键字(register、volatile、goto、auto、signed、extern)iii.C99引入的新关键字(const、restrict、inline、_Complex、_Imaginary、_Bool)b)标识符i.标识符命名规则1.字母、数字、下划线,数字不能开头2.不能跟保留字冲突3.大小写敏感c)运算符(优先级、结合性)i.算术运算符(+、-、*、/、%)ii.关系运算符(<、>、==、>=、<=、!=)iii.逻辑运算符(!、&&、||)iv.位运算符(<<、>>、~、|、&、^)v.赋值运算符(=)vi.条件运算符(? :)vii.成员运算符(.、->)viii.下标运算符([])ix.sizeof运算符x.类型转换运算符xi.逗号运算符d)直接量(100、3.14、1.5f、100ul、’A’、”Hello”、’\xAB’)e)分隔符(左大括号、右大括号、分号、逗号、冒号、空格)f)数据类型i.基本类型(整型、字符型、浮点型、双精度型、枚举型)ii.复合类型(数组类型、结构体类型、联合体类型)iii.指针类型iv.void类型g)变量和常量i.声明和赋值ii.不同类型混合运算(类型提升)3.程序流程控制a)分支(if、else、switch…case…default)b)循环(while、do…while、for、goto)4.数组a)一维数组和二维数组i.定义ii.初始化b)字符数组(C语言中表示字符串)i.常用字符串操作函数:1.strlen()---求字符串长度2.strcat()---字符串连接3.strcpy()---不能用=为字符串赋值4.strcmp()---不能用关系运算符比较字符串ii.puts()/gets()(gets()函数存在安全隐患,用fgets()代替)iii.字符串和基本数据类型转换函数:1.itoa() / atoi() / ltoa() / atol() / atof() ……iv.其他字符串操作函数:1.strchr() / strstr() / strtok() ……5.函数a)标准库函数和自定义函数b)函数的格式(函数原型声明)c)可以相互调用不能嵌套定义(函数之间是平行关系相互独立)d)函数调用的过程(保存现场→调用→恢复现场)e)变长参数(stdarg.h)f)外部函数(系统默认为extern)和内部函数(static)g)函数的递归调用(递归调用的优缺点)i.收敛条件(何时不再递归)ii.递归公式6.编译预处理a)文件包含:#includei.双引号包含ii.<>包含b)宏定义:#define和#undef(谨慎使用)i.不带参数的宏ii.带参数的宏(优点和缺点)iii.可变宏(C99新特性)iv.#undef不能够取消定义的宏(__DATE__、__FILE__、__LINE__等)c)条件编译:#if、#elif、#endif、#ifdef、#ifndef、#elsed)#pragmai.#pragma c9x onii.#pragma pack(1)iii.#pragma comment(lib, “ws2_32.lib”)iv.……e)其他:#error / #warning / #line等7.指针a)三种内存:栈(stack)、静态存储区、堆(heap)b)相关运算:& 、*、++、--c)两个函数:malloc() 和free()d)各种类型的指针i.指向变量的指针:T *ptr;ii.指向指针的指针:T **ptr;iii.指向数组的指针:T (*ptr)[size];iv.指向函数的指针:T (*ptr)(T1, T2);e)常见内存操作错误:i.内存未分配就使用ii.内存分配成功但没有初始化就使用iii.内存访问越界iv.内存泄露v.释放了内存却继续使用f)正确使用指针和内存的关键:i.用malloc()等函数申请内存后,应立即检查指针值是否为NULL,防止使用NULL所指内存单元ii.不要忘记为数组和动态内存赋值,防止未被初始化的内存作为赋值运算的右值iii.避免数组或指针下标越界,特别注意边界点iv.动态内存的申请和释放必须配对,防止内存泄漏v.用free()函数释放内存后应将指针赋值为NULL,防止产生野指针g)使用断言(assert)i.#include <assert.h>ii.assert(条件)iii.使断言失效:#define NDEBUG8.结构体/联合体a)二者的区别:联合体共享内存(典型的应用:编码转换)b)结构体/联合体的使用i.定义(可以嵌套、可以通过typedef重命名)ii.初始化(可以将一个结构体赋给另一个结构体)iii.访问(结构体变量用.访问成员;结构体指针用->访问成员)c)结构体对齐问题i.sizeof运算ii.#pragma pack(x)9.文件a)文件指针---FILE *fp;b)文件操作函数i.fopen(文件名,打开模式)ii.fclose(文件指针)iii.fgetc() / fputc()iv.fread() / fwrite()v.fscanf() / fprintf()vi.fseek() / ftell() / rewind() / ferror()10.位运算a)基本运算:<<、>>、|、&、~、^b)位域(在结构体中使用)i.只能对整型(char、short、int、long、long long)进行位域操作ii.不能用指针访问位域成员11.高级专题a)编程标准:注释、括号、空格、结构化编程、命名b)优化:优化策略(内联、循环展开、表达式分组、尾递归消去等)c)时间和日期:时间日期函数d)程序出错处理(测试和调试)i.off-by-one错误ii.fencepost错误iii.overflow错误iv.参数缺失错误v.数组越界错误(C99引入了长度可变的数组)e)管理内存。

fortran c c++发展历史

fortran c c++发展历史

一、Fortran的发展历史Fortran(Formula Translation)是一种编程语言,最初在1950年代由IBM开发。

它是世界上第一种广泛使用的高级编程语言,专门用于科学和工程计算。

Fortran的发展和演变可以追溯到上世纪50年代。

1. 1954年,IBM开发了Fortran 0的原型,并在1957年发布了Fortran I版本。

这是世界上第一种高级编程语言,为科学和工程计算提供了便利。

2. 1962年发布了Fortran II版本,引入了子程序(subroutines)和函数(functions)的概念。

这为程序员提供了更大的灵活性和模块化的能力。

3. 1966年发布了Fortran 66版本,这是第一个被ANSI(美国国家标准协会)认可的Fortran标准。

它引入了更多的数学函数、标准化输出和输入,以及更好的程序结构。

4. 1977年发布了Fortran 77版本,这个版本增加了对结构化编程的支持,引入了逻辑表达式、控制结构和一些新的内建函数。

5. 1990年发布了Fortran 90版本,这个版本是最重大的变革之一。

它引入了模块化的概念、动态内存分配、指针、以及其他一些现代编程语言所具备的特性。

6. 2004年发布了Fortran 2003版本,新增了一些新的特性,如对C 语言的互操作性、新的数组操作符等。

还引入了一些更为现代的编程特性,如异常处理、并行编程等。

7. 目前最新的版本是Fortran 2018,它在之前版本的基础上进一步完善和扩展了一些功能,使得Fortran更适合于现代科学和工程计算的需求。

二、C语言的发展历史C语言是一种通用的高级编程语言,由美国计算机科学家丹尼斯·里奇(Dennis Ritchie)于20世纪70年代初在贝尔实验室设计开发。

C 语言的设计目标是提供一种能以简洁方式编写系统软件的编程语言。

1. 1972年,贝尔实验室的丹尼斯·里奇开始设计C语言,并在1978年正式发布了第一个正式的C语言标准。

c99标准解析

c99标准解析

c99标准解析C99标准是一种用于编程语言C的规范,它于1999年制定,并在2000年正式发布。

该标准意在改进C89标准,增加新功能并纠正一些问题。

下面我们来解析C99标准的主要特性。

1. 新的数据类型:C99引入了一些新的数据类型,例如long long int和_Bool。

长长整型(long long int)允许表示更大的整数值,而_Bool类型则用于表示布尔值(真或假)。

2. 变长数组:C99标准允许数组的长度是变量,而不仅仅是一个常量表达式。

这使得在运行时动态地分配数组成为可能。

3. 变量声明和初始化:C99允许在任意位置声明和初始化变量,而不仅仅是在代码块的开始处。

这使得编写更灵活的代码成为可能。

4. 复合字面量:C99引入了复合字面量的概念,允许在一行代码中声明并初始化复合数据类型,例如结构体和数组。

5. 内联函数:C99标准允许将函数声明为内联函数,以便在每次调用时直接将其嵌入到调用的位置。

这可以提高程序的执行效率。

6. 附属对象和复杂表达式:C99允许在struct或union类型中定义附属对象(flexible array member),这样可以在结构或联合的末尾声明一个长度可变的数组。

此外,C99还提供了更强大的宏扩展功能,可以编写更复杂的表达式。

7. 新的标准库函数:C99标准引入了一些新的标准库函数,例如snprintf()和stdint.h头文件中定义的整数类型。

这些函数和类型的引入增强了C语言的功能。

总结:C99标准在C89标准的基础上引入了许多新功能和特性,使得编写C代码更加方便和灵活。

它的广泛应用对于C语言程序员来说是一个重大的进步,帮助他们更好地开发高效、可维护的软件。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

C99标准的新特性Duanchangzhi 2010-6-29先简单介绍下C语言的标准.C语言的发展历史大致上分为三个阶段:Old Style C、C89和C99.Ken Thompson和Dennis Ritchie发明C语言时有很多语法和现在并不一样,但为了向后兼容性(Backward Compatibility), 这些语法仍然在C89和C99中保留下来了.C89是最早的C语言规范,于1989年提出,1990年先由ANSI(美国国家标准委员会,American National Standards Institute)推出ANSI版本,后来被接纳为ISO国际标准(ISO/IEC 9899:1990),因而有时也称为C90,最经典的C语言教材[K&R]就是基于这个版本的,C89是目前最广泛采用的C语言标准,大多数编译器都完全支持C89.C99标准(ISO/IEC 9899:1999)是在1999年推出的,加入了许多新的特性,但目前仍没有得到广泛支持,在C99推出之后相当长的一段时间里,连gcc也没有完全实现C99的所有特性.现在介绍一下C99相对于C89或者ANSI C的特性.1、增加restrict指针C99中增加了适用于指针的restrict类型修饰符,它是初始访问指针所指对象的惟一途径,因此只有借助restrict指针表达式才能访问对象.restrict指针主要用做函数形参,或者指向由malloc()函数所分配的内存变量.restrict数据类型不改变程序的语义.如果某个函数定义了两个restrict指针形参,编译程序就假定它们指向两个不同的对象,memcpy()函数就是restrict指针的一个典型应用示例.C89中memcpy()函数原型如下:void *memcpy (void *s1, const void *s2, size_t size);如果s1和s2所指向的对象重叠,其操作就是未定义的.memcpy()函数只能用于不重叠的对象.C99中memcpy()函数原型如下:void *memcpy(void *restrict s1, const void *restrict s2,size_t size);通过使用restrict修饰s1和s2参数,可确保它们在该原型中指向不同的对象.2、inline(内联)关键字内联函数除了保持结构化和函数式的定义方式外,还能使程序员写出高效率的代码.函数的每次调用与返回都会消耗相当大的系统资源,尤其是当函数调用发生在重复次数很多的循环语句中时.一般情况下,当发生一次函数调用时,函数与参数需要进栈,各种寄存器内存需要保存.当函数返回时,寄存器的内容需要恢复,如果该函数在代码内进行内联扩展,当代码执行时,这些保存和恢复操作不会再发生,因为没有函数的进栈与退栈了,而且函数调用的执行速度也会大大加快,函数的内联扩展会产生较长的代码,所以只应该内联对应用程序性能有显著影响的函数以及长度较短的函数,即短小精悍且多次调用的函数.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_Imaginary;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),long long int能够支持的整数长度为64位.4、对数组的增强可变长数组(VLA)C99中,程序员声明数组时,数组的维数可以由任一有效的整型表达式确定,包括只在运行时才能确定其值的表达式,这类数组就叫做可变长数组.但是只有局部数组才可以是变长的.可变长数组的维数在数组生存期内是不变的,也就是说,可变长数组不是动态的.可以变化的只是数组的大小.可以使用*来定义不确定长的可变长数组.在栈中分配VLA 时,仿佛调用了alloca 函数。

无论其作用域如何,其生存期与通过调用alloca 在栈中分配数据时相同;直到函数返回时为止。

如果在其中分配VLA 的函数返回时释放栈,则释放分配的空间。

实例如下:#include <stdio.h>void foo(int);int main(void){foo(4);return(0);}void foo (int n){int i;int a[n];for (i = 0; i < n; i++){a[i] = n-i;}for (i = n-1; i >= 0; i--){printf("a[%d] = %d\n", i, a[i]);}}example% cc test.cexample% a.outa[3] = 1a[2] = 2a[1] = 3a[0] = 4数组声明中的类型修饰符在C99中,如果需要使用数组作为函数参数,可以在数组声明的方括号内使用static关键字,这相当于告诉编译程序,参数所指向的数组将至少包含指定的元素个数,也可以在数组声明的方括号内使用restrict, volatile, const关键字,但只用于函数参数,如果使用restrict,指针是初始访问该对象的惟一途径,如果使用const,指针始终指向同一个数组,使用volatile没有任何意义,5、单行注释字符// 引入包含直到(但不包括)新换行符的所有多字节字符的注释,除非// 字符出现在字符常量、字符串文字或注释中.6、分散代码与声明现在,C 编译器接受关于可执行代码的混合类型声明,如以下示例所示:#include <stdio.h>int main(void){int num1 = 3;printf("%d\n", num1);int num2 = 10;printf("%d\n", num2);return(0);}7、预处理程序的修改1、具有可变数目的参数的宏C 编译器接受以下形式的#define 预处理程序指令:#define identifier (...) replacement_list#define identifier (identifier_list, ...) replacement_list如果宏定义中的identifier_list 以省略号结尾,则意味着调用中的参数比宏定义中的参数(不包括省略号)多。

否则,宏定义中参数的数目(包括由预处理标记组成的参数)与调用中参数的数目匹配。

对于在其参数中使用省略号表示法的#define 预处理指令,在其替换列表中使用标识符__VA_ARGS__。

以下示例说明可变参数列表宏工具。

#define debug(...) fprintf(stderr, __VA_ARGS__)#define showlist(...) puts(#__VA_ARGS__) //这里使用了字符化符号##define report(test, ...)((test)?puts(#test):printf(__VA_ARGS__))debug(“Flag”);debug(“X = %d\n”,x);showlist(The first, second, and third items.);report(x>y, “x is %d but y is %d”, x, y);其结果如下:fprintf(stderr, “Flag”);fprintf(stderr, “X = %d\n”, x);puts(“The first, second, and third items.”);((x>y)?puts(“x>y”):printf(“x is %d but y is %d”, x, y));2、_Pragma操作符_Pragma ( string-literal ) 形式的一元操作符表达式处理如下:■如果字符串文字具有L 前缀,则删除该前缀。

■删除前导和结尾双引号。

■用双引号替换每个换码序列'。

■用单个反斜杠替换每个换码序列\\。

预处理标记的结果序列作为pragma 指令中的预处理程序标记进行处理。

删除一元操作符表达式中的最初四个预处理标记。

与#pragma 比较,_Pragma 的优势在于:_Pragma 可以用于宏定义。

_Pragma("string") 与#pragma 字符串行为完全相同。

考虑以下示例。

首先列出示例的源代码,然后在预处理程序使其通过预处理之后,再列出示例的源代码。

#include <omp.h>#include <stdio.h>#define Pragma(x) _Pragma(#x)#define OMP(directive) Pragma(omp directive) void main(){omp_set_dynamic(0);omp_set_num_threads(2);OMP(parallel){printf("Hello!\n");}}下面是预处理程序完成后的源代码。

void main(){omp_set_dynamic(0);omp_set_num_threads(2);# pragma omp parallel{printf("Hellow!\n");}}3、内部编译指令STDC FP_CONTRACT ON/OFF/DEFAULT若为ON,浮点表达式被当做基于硬件方式处理的独立单元,默认值是定义的工具.STDC FEVN_ACCESS ON/OFF/DEFAULT告诉编译程序可以访问浮点环境,默认值是定义的工具.STDC CX_LIMITED_RANGE ON/OFF/DEFAULT若值为ON,相当于告诉编译程序某程序某些含有复数的公式是可靠的,默认是OFF.4、新增的内部宏__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语句所控制的循环体内.在C89中,这样是不可以的,具体可以在VC6中验证.VC6支持到C89.C 编译器接受作为for 循环语句中第一个表达式的类型声明:for (int i=0; i<10; i++){ //loop body };for 循环的初始化语句中声明的任何变量的作用域是整个循环(包括控制和迭代表达式)。

相关文档
最新文档