天天看点

C99和C89C99与C89的亲子关系

这是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,但不起作用。

c C99