文章转自 https://blog.csdn.net/lengye7/article/details/80255833

C99相比C89新增内容

由于c99相对于c89有一些废除内容,所以c99并不兼容c89,以下为c99相对于c89的改动。

1、增加restrict指针

C99中增加了公适用于指针的restrict类型修饰符,它是初始访问指针所指对象的惟一途径,因此只
有借助restrict指针表达式才能访问对象。restrict指针指针主要用做函数变元,或者指向由malloc()
数所分配的内存变量。restrict数据类型不改变程序的语义。
  如果某个函数定义了两个restrict指针变元,编译程序就假定它们指向两个不同的对象,memcpy()
函数就是restrict指针的一个典型应用示例。C89中memcpy()函数原型如下:
代码:

void *memcpy (void *s1, const void *s2, size_t size);

如果s1和s2所指向的对象重叠,其操作就是未定义的。memcpy()函数只能用于不重叠的对象。C99中memcpy()函数原型如下:
代码:

void *memcpy(void *restrict s1, const void *restrict s2,size_t size);

通过使用restrict修饰s1和s2 变元,可确保它们在该原型中指向不同的对象。

2、inline(内联)关键字

内联函数除了保持结构化和函数式的定义方式外,还能使程序员写出高效率的代码.函数的每次调用与
返回都会消耗相当大的系统资源,尤其是当函数调用发生在重复次数很多的循环语句中时.一般情况下,当发
生一次函数调用时,变元需要进栈,各种寄存器内存需要保存.当函数返回时,寄存器的内容需要恢复。如果该
函数在代码内进行联机扩展,当代码执行时,这些保存和恢复操作旅游活动会再发生,而且函数调用的执
行速度也会大大加快。函数的联机扩展会产生较长的代码,所以只应该内联对应用程序性能有显著影响的
函数以及长度较短的函数。

3、新增数据类型

_Bool 
  值是0或1。C99中增加了用来定义bool、true以及false宏的头文件夹<stdbool.h>,以便程序
员能够编写同时兼容于C与C++的应用程序。在编写新的应用程序时,应该使用
<stdbool.h>头文件中的bool宏。

_Complex and _Imaginary

C99标准中定义的复数类型如下:`f

loat_Complex; float_Imaginary; double_Complex; double_Imaginary; long double_Complex; long double_Imaginary.

<complex.h>头文件中定义了complex和imaginary宏,并将它们扩展为_Complex和_Imaginary,
因此在编写新的应用程序时,应该使用<stdbool.h>头文件中的complex和imaginary宏。
  long long int
  C99标准中引进了long long intunsigned long long int,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新增的库

C89中标准的头文件<assert.h> 定义宏assert()<ctype.h> 字符处理<errno.h> 错误报告<float.h> 定义与实现相关的浮点值勤<limits.h> 定义与实现相关的各种极限值<locale.h> 支持函数setlocale()<math.h> 数学函数库使用的各种定义<setjmp.h> 支持非局部跳转<signal.h> 定义信号值<stdarg.h> 支持可变长度的变元列表<stddef.h> 定义常用常数<stdio.h> 支持文件输入和输出<stdlib.h> 其他各种声明<string.h> 支持串函数<time.h> 支持系统时间函数

C99新增的头文件和库

<complex.h> 支持复数算法
  <fenv.h> 给出对浮点状态标记和浮点环境的其他方面的访问
  <inttypes.h> 定义标准的、可移植的整型类型集合。也支持处理最大宽度整数的函数(常见)
  <iso646.h> 首先在此1995年第一次修订时引进,用于定义对应各种运算符的宏
  <stdbool.h> 支持布尔数据类型类型。定义宏bool,以便兼容于C++
  <stdint.h> 定义标准的、可移植的整型类型集合。该文件包含在<inttypes.h>中(常见)
  <tgmath.h> 定义一般类型的浮点宏
  <wchar.h> 首先在1995年第一次修订时引进,用于支持多字节和宽字节函数
  <wctype.h> 首先在1995年第一次修订时引进,用于支持多字节和宽字节分类函数

14、__func__预定义标识符

用于指出__func__所存放的函数名,类似于字符串赋值。

15、其它特性的改动

放宽的转换限制
 
    限制             C89标准  C99标准
    数据块的嵌套层数       15     127
    条件语句的嵌套层数      8      63
    内部标识符中的有效字符个数  31     63
    外部标识符中的有效字符个数  6      31
    结构或联合中的成员个数    127    1023
    函数调用中的参数个数     31     127

不再支持隐含式的int规则
  删除了隐含式函数声明
  对返回值的约束
    C99中,非空类型函数必须使用带返回值的return语句.
  扩展的整数类型
    扩展类型 含义
    int16_t 整数长度为精确16位
    int_least16_t 整数长度为至少16位
    int_fast32_t 最稳固的整数类型,其长度为至少32位
    intmax_t 最大整数类型
    uintmax_t 最大无符号整数类型
  对整数类型提升规则的改进
    C89中,表达式中类型为char,short int或int的值可以提升为int或unsigned int类型.
    C99中,每种整数类型都有一个级别.例如:long long int 的级别高于int, int的级别高于char
等.在表达式中,其级别低于int或unsigned int的任何整数类型均可被替换成int或unsigned int类型.

C99相比C89新增内容相关推荐

  1. C语言规范:C89、C90、C95、C99及C89和C99区别

    [K&R C] 1978 年,Dennis Ritchie 和 Brian Kernighan 合作推出了<The C Programming Language>的第一版(按照惯例 ...

  2. AppleWatch开发教程之Watch应用对象新增内容介绍以及编写运行代码

    AppleWatch开发教程之Watch应用对象新增内容介绍以及编写运行代码 添加Watch应用对象时新增内容介绍 Watch应用对象添加到创建的项目中后,会包含两个部分:Watch App 和 Wa ...

  3. 安卓手机怎么查看iccid_安卓便签敬业签怎么查看日历月视图中一天所有的新增内容?...

    有的用户在使用手机安卓便签敬业签的时候,会创建多个不同的分类来记事,但是当他想要查看某一天新增的所有便签内容时,应该怎么查看呢?相信有不少用户都知道时间轴中会记录所有新增.修改.删除的个人便签内容,所 ...

  4. 的ui在vs中显示没有成员_在电脑桌面使用敬业签团队便签怎么设置新增内容在上面显示?...

    实时跟进小组成员的各项任务的完成情况,及时将工作任务安排下去,是提高团队工作效率的较为有效的方法.在监督小组成员任务状况以及及时安排工作方面,选择一款支持多人同步在线协作的软件是非常有必要的. 敬业签 ...

  5. Text组件新增内容通过tag_config设置前景色、背景色

    Text组件新增内容时,可以通过tag_config给特定的字符串设定前景色.背景色等属性. self.text1.tag_config('red',foreground = 'red',backgr ...

  6. php渔夫,渔夫有爱——5.2钓鱼新增内容 附日常稀有鱼经验

    本文来源于NGACN,作者 :subaru39 渔夫有爱--5.2钓鱼新增内容(附日常稀有鱼经验) [没心思看全篇的童鞋请直接拉到底端看总结] 昨天5.2更新但是没空上,今天上线在半山种完地以后忽然发 ...

  7. 8.0魔兽服务器维护时间,魔兽世界8.0什么时候上线 wow8.0开放时间及新增内容一览...

    魔兽世界8.0什么时候上线?wow8.0新增了哪些?下面小编带来wow8.0开放时间及新增内容一览,希望对大家有所帮助. wow8.0开放时间及新增内容一览: 8.0的剧情是玩家合力击退了燃烧军团,并 ...

  8. 腐烂国度2主宰版计算机学知识,腐烂国度2主宰版 新增内容及mod说明

    <腐烂国度2:主宰版>图文全攻略,全任务全基地详解资料攻略(含"新增内容""资料合集""全任务/基地""上手指南&qu ...

  9. 9适应之力加多少攻击_剑盾铠之孤岛DLC新增内容大全! 宝可梦史上第一款DLC到底香不香(含试玩视频)...

    6月17日晚9点,随着宝可梦公司那个最重要的消息是公布了下周同一时间还有一场发布会的发布会开始,<宝可梦剑/盾>DLC第一弹正式推送了更新,苦苦等待的玩家们表示:不过还有很多小伙伴们没有第 ...

最新文章

  1. jmeter压测_jmeter压测学习2linux运行jmeter环境
  2. Shodan搜索引擎介绍
  3. 【实用】表维护视图SM30增加自定义按钮的实现
  4. python 多进程 multiprocessing.Queue()报错:The freeze_support() line can be omitted if the program
  5. 【渝粤教育】 国家开放大学2020年春季 1068小企业管理 参考试题
  6. leetcode1415. 长度为 n 的开心字符串中字典序第 k 小的字符串(回溯)
  7. ado.net的操作查询数据 0127
  8. java入门第二天课程,Java菜鸟培训第二天
  9. Keil MDK详细讲解
  10. 退出功能—session
  11. SPSS 数据编辑器界面 度量 名义 序号 标签
  12. Android官方源码资料博客
  13. 我要做 Android 之面笔试
  14. android 解析XML方式(二)
  15. python练习实例(七)
  16. 打地鼠游戏(Appinventor练习)
  17. NX/UG二次开发—建模—批量创建重复特征方案优化
  18. Linux高性能并发服务器发开学习(二进程和线程)
  19. Weblogic配置jms服务文档,是自己总结网上搜集到的资料以及自己亲自动手配置测试的总结。
  20. JAVA 赛码网|笔试时输入输出的控制

热门文章

  1. JS报错:Uncaught ReferenceError: ShowDetail is not defined at HTMLAnchorElement.onclick
  2. 给百度CEO李彦宏的公开拜年信(转载)
  3. mobiscroll 的详细用法
  4. Java中流的概念的细分
  5. 用C语言解“求符合给定条件的整数集”题
  6. 1.5心理测试代码的解析
  7. 解决uni-app chunk-vendors.js:28553 GET http://localhost:8080/sockjs-node/info?t=1624461967173
  8. 上瘾性行为,戒不掉的颓废
  9. 计算机职业素质选修课,公共选修课网上选课系统的设计与实现-计算机应用技术专业论文.docx...
  10. CCCC L2-007. 家庭房产 建图 XJB模拟