3、新增数据类型 _Bool 值是0或1。C99中增加了用来定义bool、true以及false宏的头文件夹,以便程序 员能够编写同时兼容于C与C++的应用程序。在编写新的应用程序时,应该使用 头文件中的bool宏。 _Complex and _Imaginary C99标准中定义的复数类型如下:float_Complex; float_Imaginary; double_Complex; double_Imaginary; long double_Complex; long double_Imaginary. 头文件中定义了complex和imaginary宏,并将它们扩展为_Complex和_Imaginary, 因此在编写新的应用程序时,应该使用头文件中的complex和imaginary宏。 long long int C99标准中引进了long long int(-(2e63 - 1)至2e63 - 1)和unsigned long long int(0 - 2e64 - 1)。long long int能够支持的整数长度为64位。 4、对数组的增强 可变长数组 C99中,程序员声明数组时,数组的维数可以由任一有效的整型表达式确定,包括只在运行时才能确定 其值的表达式,这类数组就叫做可变长数组,但是只有局部数组才可以是变长的. 可变长数组的维数在数组生存期内是不变的,也就是说,可变长数组不是动态的.可以变化的只是数组的大小. 可以使用*来定义不确定长的可变长数组。
数组声明中的类型修饰符 在C99中,如果需要使用数组作为函数变元,可以在数组声明的方括号内使用static关键字,这相 当于告诉编译程序,变元所指向的数组将至少包含指定的元素个数。也可以在数组声明的方括号内使用 restrict,volatile,const关键字,但只用于函数变元。如果使用restrict,指针是初始访问该对象的惟一途 径。如果使用const,指针始终指向同一个数组。使用volatile没有任何意义。 5、单行注释 引入了单行注释标记 "//" , 可以象C++一样使用这种注释了。 6、分散代码与声明 7、预处理程序的修改 a、变元列表 宏可以带变元,在宏定义中用省略号(...)表示。内部预处理标识符__VA_ARGS__决定变元将在何 处得到替换。例:#define MySum(...) sum(__VA_ARGS__) 语句MySum(k,m,n); 将被转换成:sum(k, m, n); 变元还可以包含变元。例: #define compare(compf, ...) compf(__VA_ARGS__) 其中的compare(strcmp,"small", "large"); 将替换成: strcmp("small","large"); b、_Pragma运算符 C99引入了在程序中定义编译指令的另外一种方法:_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,相当于告诉编译程序某程序某些含 有复数的公式是可靠的。默认是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标准的年和月格式: yyymmmL 8、for语句内的变量声明 C99中,程序员可以在for语句的初始化部分定义一个或多个变量,这些变量的作用域仅于本for语 句所控制的循环体内。比如:代码: for(int i=0; i<10; i++){ // do someting ... } 9、复合赋值 C99中,复合赋值中,可以指定对象类型的数组、结构或联合表达式。当使用复合赋值时,应在括弧 内指定类型,后跟由花括号围起来的初始化列表;若类型为数组,则不能指定数组的大小。建成的对象是 未命名的。 例: double *fp = (double[]) {1.1, 2.2, 3.3}; 该语句用于建立一个指向double的指针fp,且该指针指向这个3元素数组的第一个元素。 在文件 域内建立的复合赋值只在程序的整个生存期内有效。在模块内建立的复合赋值是局部对象,在退出模块后 不再存在。 10、柔性数组结构成员 C99中,结构中的最后一个元素允许是未知大小的数组,这就叫做柔性数组成员,但结构中的柔性数 组成员前面必须至少一个其他成员。柔性数组成员允许结构中包含一个大小可变的数组。sizeof返回的这 种结构大小不包括柔性数组的内存。包含柔性数组成员的结构用malloc()函数进行内存的动态分配,并且 分配的内存应该大于结构的大小,以适应柔性数组的预期大小。 11、指定的初始化符 C99中,该特性对经常使用稀疏数组的程序员十分有用。指定的初始化符通常有两种用法:用于数组, 以及用于结构和联合。用于数组的格式:[index] = vol; 其中,index表示数组的下标,vol表示本数组 元素的初始化值。 例如: int x[10] = {[0] = 10, [5] = 30}; 其中只有x[0]和x[5]得到了初始化.用于结构或联 合的格式如下: member-name(成员名称) 对结构进行指定的初始化时,允许采用简单的方法对结构中的指定成员进行初始化。 例如: struct example{ int k, m, n; } object = {m = 10,n = 200}; 其中,没有初始化k。对结构成员进行初始化的顺序没有限制。 12、printf()和scanf()函数系列的增强 C99中printf()和scanf()函数系列引进了处理long long int和unsigned 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()函数时,允许在%f说明符前加上l修饰符,即%lf,但不起作用。 13、C99新增的库