一、总述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;
…
- main()函数
原形:
int main()
int main( int argc, char *argv[]) 第一个参数为 程序名
- inline 内联关键字 (c99)
只是对编译器的一个提示,见 《C reference book》 p219
- c99中,对一个变长的数组应用sizeof()时,将在运行时求值。
- #pragma伪指令是实现定义的伪指令,可为编译器提供各种指示。
c99包含另一种在程序中指定编译选项的方法:_Pragma 运算符,详见
《C reference book》 p46。
- 预定义宏,详见《C reference book》 p34。
- c99 的注释: // ~ 和 /* ~ */
- c99的可变参数表
#define my_printf(...) fprintf(stderr,_VA_ARGS_)
详见《C reference book》 p39
- c99中的printf()和scanf()支持浮点数格式和long long的输入。
- c99大大增加C数学函数库的大小,<math.h>。
c99增加判断浮点数非数值类型(INFINITY,NAN)的宏。
能正确处理非数值类型的比较函数。
能通过设置math_errhandling的值设置是返回错误号还是抛出异常。详见《C reference book》 p302
原有函数库皆是double版本,c99提供float和long double版本。
- c99中,realloc的准确动作和c89中稍有不同。
- c99增加的函数
atoll(),把字符串转成long long 型,
llabs(),long long 绝对值
lldiv(), long long 除
- raise()和signal()是一组信号响应的函数组。用于异步的事件处理,如可以向注册,当浮点数计算发生异常时,调用某一个函数。详见《C reference book》 p324
例子
float a,b;
// 注册信号和相应的函数句柄。
if( signal( SIGFPE, fphandler ) == SIG_ERR )
{
a/b;
}
// 异常发生时的处理函数。
void fphandler( int sig, int num )
{
...
}
- va_copy宏,在参数列表中复制当前ap的状态,以后可以恢复。就是使参数不仅仅向前遍历。
详见《C reference book》 p325
- c99增加的库功能
复数库 <complex.h>
浮点环境库 <fenv.h>
1.<stdint.h>没有声明任何函数,只定义了大量的整数类型和宏。这些整数类型用来声明已知大小或者具有某种特性的整数
2.<inttypes.h>增加几个专门的整数格式转换函数,允许在整数和最大宽度整数类型之间转换。
3.<tgmath.h>,c99的数学库,具有三种类型的版本。由于c不支持函数重载,使在不同版本间调用函数很难切换。<tgmath.h>中的宏自动根据参数自动转换成相应的函数。
4.<stdbool.h>布尔型
- at the beginning press enter key
二、其它知识
goto只能在一个函数中跳转。
register只能用于局部变量。在C语言中,不能获得register变量的地址。
printf,如果与格式限定符匹配的参数不够,输出是不确定的;如果参数数量超过格式限定符数量,则丢弃多余的参数。
三、c不支持的部分
模版
函数重载
默认函数参数值
引用参数, swap(&X, &Y)