这是c0conut同学的一份作业,也可以理解为总结,为了保留这份作业,写了博客。我尽量使自己写得简单好懂有趣。
C99与C89的亲子关系
就如DOM结构一般,C99与C89之间也充满温情。老父亲C89顾名思义出生于89年,也被称为ANSI,C99出生于1999年,在C89的基础上进行发展和拓展,充分继承和发扬了Dio家的特质。
C99的优秀之处(?)拒绝吹捧,人人有责
1.主流编译器基本都支持C99
举个栗子,gcc基本3.0+都支持C99(现在使用的gcc是7.3.x版本)。但是呢,众所周知,MS爹爹和C99三官不和,所以vs对C99支持比较差,从2013版本开始部分支持,到2017版本也是部分支持。
2.C99中增加了公适用于指针的restrict类型修饰符
作为初始访问指针所指对象的惟一途径。这句话也就是说,restrict只能用于指针,它指针成为唯一初始的访问对象的方式,这可以使编译器自己作出优化。
3.对编译器限制支持了
比如源程序每行要求至少支持到 4095 字节,变量名与函数名的要求支持到 63 字节 (extern 要求支持到 31)。
4.局部变长数组
举例子:
struct love
{int she=1;
int he[0];}
这里he是一个长度为0的数组,他的地址跟在love之后,如果给love分配了太多空间,多出来的就是数组he的啦。
还可以写
struct modian
{int kill=233;
char me[];}
5.支持单行注释
6.有了bool,true,false
7.for语句内可以进行变量声明
8.复合赋值中可以指定对象类型的数组、结构或联合表达式
9.这是一个比较的表
- 限制 C89标准 C99标准
- 数据块的嵌套层数 15 127
- 条件语句的嵌套层数 8 63
- 内部标识符中的有效字符个数 31 63
- 外部标识符中的有效字符个数 6 31
- 结构或联合中的成员个数 127 1023
- 函数调用中的参数个数 31 127
10.指定的初始化
举例子
int a[10]=
{
[1]=1,
[2]=2;
};
再举个例子
struct date
{
int hour,min;
}date1={min=1};
11. printf()和scanf()函数系列的增强
C99中printf()和scanf()函数系列引进了处理long long int和unsigned long long int数据类型
的特性。long long int 类型的格式修饰符是ll。
C99还引进了hh修饰符。用于指定char型变元。ll和hh修饰符均可以用于n说明符。
格式修饰符a和A用在printf()函数中时,结果将会输出十六进制的浮点数。使用A格式修饰符时,x和p必须是大写。A和a格式修饰符也可以用在scanf()函数中,用于读取浮点数。调用printf()函数时,允许在%f说明符前加上l修饰符,即%lf,但不起作用。