一、总述c99:粗略描述,并非完整的归纳。
增加部分
1.类型,属于关键字
布尔 _Bool 头文件 <stdbool.h>包含更简明的宏bool,当不与原有代码冲突时,建议包含此头文件。
复数 _Complex 头文件 <complex.h>包含更简明的宏comlex,当不与原有代码冲突时,建议包含此头文件。
虚数 _Imaginary 头文件 <complex.h>包含更简明的宏imaginary,当不与原有代码冲突时,建议包含此头文件。
64位:
long long int = signed long long int
unsigned long long int
2.标示符
外部标示符至少31个
内部标示符至少63个
3.restrict类型限定符
“目前只有指针是访问其指向对象的唯一方式。”它有多种用途。详见 《C reference book》 p65。
4.常量
后缀修饰符
long类型 100L
float 123.3F
unsigned 1000U
(c99)long long 234LL 123ll
十六进制 0xff
八进制 012
5.函数
c99 不支持返回值默认为int,不过大部分编译器仍然允许。
6.函数原形
无参数为 int f(void)
7.变量的生命周期
c99 中,局部变量几乎可以在任何地方声明。
c89 中,必须在模块开始处
如 void f(int a)
{
int i;
i=10;
int b;
…
原形:
int main()
int main( int argc, char *argv[]) 第一个参数为 程序名
只是对编译器的一个提示,见 《C reference book》 p219
c99包含另一种在程序中指定编译选项的方法:_Pragma 运算符,详见
《C reference book》 p46。
#define my_printf(...) fprintf(stderr,_VA_ARGS_)
详见《C reference book》 p39
c99增加判断浮点数非数值类型(INFINITY,NAN)的宏。
能正确处理非数值类型的比较函数。
能通过设置math_errhandling的值设置是返回错误号还是抛出异常。详见《C reference book》 p302
原有函数库皆是double版本,c99提供float和long double版本。
atoll(),把字符串转成long long 型,
llabs(),long long 绝对值
lldiv(), long long 除
例子
float a,b;
// 注册信号和相应的函数句柄。
if( signal( SIGFPE, fphandler ) == SIG_ERR )
{
a/b;
}
// 异常发生时的处理函数。
void fphandler( int sig, int num )
{
...
}
详见《C reference book》 p325
复数库 <complex.h>
浮点环境库 <fenv.h>
1.<stdint.h>没有声明任何函数,只定义了大量的整数类型和宏。这些整数类型用来声明已知大小或者具有某种特性的整数
2.<inttypes.h>增加几个专门的整数格式转换函数,允许在整数和最大宽度整数类型之间转换。
3.<tgmath.h>,c99的数学库,具有三种类型的版本。由于c不支持函数重载,使在不同版本间调用函数很难切换。<tgmath.h>中的宏自动根据参数自动转换成相应的函数。
4.<stdbool.h>布尔型
二、其它知识
goto只能在一个函数中跳转。
register只能用于局部变量。在C语言中,不能获得register变量的地址。
printf,如果与格式限定符匹配的参数不够,输出是不确定的;如果参数数量超过格式限定符数量,则丢弃多余的参数。
三、c不支持的部分
模版
函数重载
默认函数参数值
引用参数, swap(&X, &Y)