本帖最后由 onlycook 于 2023-11-24 16:08 编辑
今天简要分享一下C语言标准的演进过程。C语言目前具有四套标准,从1989年至今逐步经过多次演进和标准化。其中C89基本就是C90,实际上是1989年发布的第一个C语言国际标准,也称为ANSI C(美国国家标准学会ANSI批准了该标准),后来ISO组织接受了这个标准,称为C90标准。C90定义了基本的语法、关键字、运算符、控制结构、数据类型、函数指针、标准库函数,如<stdio.h>中的输入输出函数(如printf和scanf)和<stdlib.h>中的内存管理函数(如malloc和free),其基本特点是比较简洁,易于移植。]但C90在某些方面较为局限,例如,没有提供新的数据类型(如long long)、布尔类型(bool)、单行注释等。C90要求变量的声明必须出现在函数的开头,即在函数的第一个语句之前,不允许在代码块的任何位置进行变量声明,如不支持在for循环中定义变量等。C99于1999年发布,它对C语言进行扩展改进,引入了新特性,如变长数组、复合字变量、指向函数的指针、内嵌式文档、新数学函数库、对可变参数的支持、单行注释等,也对程序安全性进行改进。提供了变量声明和初始化的灵活方式,放宽了申明规则,允许声明的同时进行初始化,允许在函数内部定义变量,如允许在for循环中定义和初始化变量,并提供了新的关键字如inline,及新的语句如_Pragma等。图1. 变长数组和复合字变量说明C99典型的一些更新如下:• 新的数据类型:C99引入了long long int类型,用于支持更大的整数范围。• 布尔类型:C99引入了_Bool类型,用于表示布尔值,取值为0或1。]• 变长数组:C99允许使用变长数组,即数组长度可以在运行时动态分配。 单行注释:C99添加了//形式的单行注释,方便程序员注释单行代码。• 更多的数学函数:C99扩展了<math.h>标准库,增加了数学函数的支持。 复数支持:C99引入了对复数(complex)的支持。C11于2011年发布,它引入了一些新特性,引入了如匿名结构体、泛型选择表达式、多线程支持、线程安全函数、动态内存分配的安全性增强,对Unicode字符的支持等,主要是对现有特性进行改进和修正,提高了C语言的表达能力和可靠性。C17于2018年发布,是C语言最新版本,C17主要是对C11进行修订和更新,进一步改进语言的特性和可用性,C17引入了初始化宏,属性和线程局部存储等。图2. XC8编译器中C90和C99的切换总之,虽然C99对C90进行了改进,但一些旧的编译器可能不完全支持C99标准,如图2中的XC8编译器界面所示说明,总的来说,C99是对C90标准的重要改进,引入了更多方便的语言特性和标准库函数,而C11和C17更新的C语言标准。
|