C语言历史与演化—C89、C99、C11、C17、C2x

 更新时间:2024年11月16日 09:15:20   作者:贩卖月光的小女孩  
C语言作为一门古老而受欢迎的编程语言,经历了多个版本的演进和标准化,本文将深入解析C语言的四套标准,即C89、C99、C11和C17,通过具体实例说明每个标准引入的新特性和改进

C语言作为一门古老而受欢迎的编程语言,经历了多个版本的演进和标准化,本文将深入解析C语言的四套标准,即C89、C99、C11和C17,通过具体实例说明每个标准引入的新特性和改进。

Traditional C

此时的 C 语言还没有标准化,来自“C Programming Language, First Edition, by Brian W. Kernighan, Dennis M. Ritchie. Prentice Hall PTR 1978”的 C 描述可算作“正式”的标准,所以此时的 C 也称为“K&R” C。

期间 C 语言一直不断的发生细微的变化,各编译器厂商也有自己的扩展,这个过程一直持续到20世纪80年代末。

C89(C90)

C89(也称为C90)是C语言的最早版本的标准,于1989年发布。它定义了C语言的基本语法、关键字和数据类型,并引入了标准库函数,如stdio.h和stdlib.h等。C89的特点是简洁、可移植且易于理解,被广泛应用于各种计算机平台。

C89 的主要改动:

  • 定义了 C 标准库;
  • 新的预处理命令和特性;
  • 函数原型(prototype);
  • 新关键字:const、volatile、signed;
  • 宽字符、宽字符串和多字节字符;
  • 转化规则、声明(declaration)、类型检查的改变。

举例来说,下面的代码展示了使用C89标准编写的程序示例:

#include <stdio.h>

int main() {
    printf("Hello, C89!\n");

    return 0;
}

在这个示例中,我们使用了C89标准的头文件 <stdio.h> 和函数 printf 来输出一条信息。

C95

这是对 C89 的一个修订和扩充,称为“C89 with Amendment 1”或 C95,严格说来并不是一个真正的标准。

C95 的主要改动:

  • 3个新标准头文件:iso646.h、wctype.h、wchar.h;
  • 一些新的标记(token)和宏(macro);
  • 一些新的 printf/scanf 系列函数的格式符;
  • 增加了大量的宽字符和多字节字符函数、常数和类型。

C99

C99标准于1999年发布,对C语言进行了扩展和改进。它引入了一些新特性,如变长数组、复合字面量、单行注释等。C99还提供了更灵活的变量声明和初始化方式,允许在代码中声明变量的同时进行初始化。

C99 的主要改动:

  • 复数(complex);
  • 整数(integer)类型扩展;
  • 变长数组;
  • Boolean 类型;
  • 非英语字符集的更好支持;
  • 浮点类型的更好支持;
  • 提供全部类型的数学函数;
  • C++ 风格注释(//)。

举例来说,下面的代码展示了使用C99标准引入的变长数组和复合字面量的示例:

#include <stdio.h>

int main() {
    int n = 5;
    int arr[n]; // 变长数组

    for (int i = 0; i < n; i++) {
        arr[i] = i + 1;
    }

    printf("Array: { ");
    for (int i = 0; i < n; i++) {
        printf("%d ", arr[i]);
    }
    printf("}\n");

    return 0;
}

在这个示例中,我们使用了C99标准引入的变长数组来定义数组 arr,其大小由变量 n 决定。同时,我们使用了复合字面量来在一行代码中初始化数组的元素。

C11

C11标准于2011年发布,是对C语言的又一次改进和扩展。它引入了一些新特性,如匿名结构体、泛型选择表达式、多线程支持等。C11还对一些现有特性进行了细微的改进和修正,提高了语言的表达能力和可靠性。

举例来说,下面的代码展示了使用C11标准引入的匿名结构体和泛型选择表达式的示例:

#include <stdio.h>

int main() {
    struct {
        int x;
        int y;
    } point = { .x = 5, .y = 10 }; // 匿名结构体

    _Generic(point, 
             struct { int x; int y; }: printf("Point: (%d, %d)\n", point.x, point.y),
             default: printf("Invalid data type!\n")); // 泛型选择表达式

    return 0;
}

在这个示例中,我们使用了C11标准引入的匿名结构体来定义结构体变量 point,并使用了泛型选择表达式 _Generic 来根据变量的类型选择不同的操作。

C17

C17(也被称为为 C18)是于2018年6月发布的 ISO/IEC 9899:2018 的非正式名称,也是目前(截止到2020年6月)为止最新的 C语言编程标准,被用来替代 C11 标准。

C17 没有引入新的语言特性,只对 C11 进行了补充和修正。

C2x

下一个版本的 C 标准,预计将于2022年12月1日完成。

有许多人提出想为 C 语言添加面向对象的特性,包括增加类、继承、多态等已被 C++ 语言所广泛使用的语法特性,但是最终被委员会驳回了。因为这些复杂的语法特性并不符合 C 语言的设计理念以及设计哲学,况且 C++ 已经有了这些特性,C 语言无需再对它们进行支持。

总结

C语言的四套标准(C89、C99、C11和C17)代表了C语言的演进和改进过程。每个标准引入了新特性和改进,为程序员提供了更强大和灵活的编程工具。通过具体实例的说明,我们深入探讨了每个标准的特点和新特性,帮助你了解C语言的不同版本,并为你在实际编程中选择合适的标准提供了指导。

到此这篇关于C语言历史与演化—C89、C99、C11、C17、C2x的文章就介绍到这了,更多相关C89、C99、C11、C17、C2x内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++超详细梳理lambda和function的使用方法

    C++超详细梳理lambda和function的使用方法

    C++在C11标准中引入了匿名函数,即没有名字的临时函数,又称之为lambda表达式.lambda表达式 实质上是创建一个匿名函数/对象,这篇文章主要介绍了lambda和function的使用方法
    2022-08-08
  • C语言指针和数组深入探究使用方法

    C语言指针和数组深入探究使用方法

    在C语言和C++等语言中,数组元素全为指针变量的数组称为指针数组,指针数组中的元素都必须具有相同的存储类型、指向相同数据类型的指针变量。指针数组比较适合用来指向若干个字符串,使字符串处理更加方便、灵活
    2022-08-08
  • 利用Matlab实现迭代适应点算法

    利用Matlab实现迭代适应点算法

    道格拉斯-普克算法(Douglas–Peucker algorithm,亦称为拉默-道格拉斯-普克算法、迭代适应点算法、分裂与合并算法)是将曲线近似表示为一系列点,并减少点的数量的一种算法。本文将利用Matlab实现这一算法,需要的可以参考一下
    2022-04-04
  • C语言实现大顶堆的示例代码

    C语言实现大顶堆的示例代码

    最大堆,又称大根堆(大顶堆)是指根结点(亦称为堆顶)的关键字是堆里所有结点关键字中最大者,属于二叉堆的两种形式之一。本文将用C语言实现大顶堆,感兴趣的可以了解一下
    2022-07-07
  • VScode编译C++ 头文件显示not found的问题

    VScode编译C++ 头文件显示not found的问题

    这篇文章主要介绍了VScode编译C++ 头文件显示not found的问题,本文给大家分享问题解决方法,通过截图的形式给大家介绍的非常详细,需要的朋友可以参考下
    2020-03-03
  • 详解C/C++中const限定符总结

    详解C/C++中const限定符总结

    const是一种限定符,被const所限定的变量其值不可以被改变。。这篇文章主要介绍了C/C++中const限定符总结,通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-02-02
  • 浅谈C++反向迭代器的设计

    浅谈C++反向迭代器的设计

    本文主要介绍了浅谈C++反向迭代器的设计,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • 如何用C写一个web服务器之CGI协议

    如何用C写一个web服务器之CGI协议

    本文主要介绍了如何用C写一个web服务器之CGI协议,对C语言和web感兴趣的同学,可以详细看下,并且试验一下。
    2021-05-05
  • C语言顺序表的基本操作(初始化,插入,删除,查询,扩容,打印,清空等)

    C语言顺序表的基本操作(初始化,插入,删除,查询,扩容,打印,清空等)

    这篇文章主要介绍了C语言顺序表的基本操作(初始化,插入,删除,查询,扩容,打印,清空等),具有很好的参考价值,希望对大家有所帮助。
    2023-02-02
  • C语言源码实现停车场管理系统

    C语言源码实现停车场管理系统

    这篇文章主要为大家详细介绍了C语言源码实现停车场管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-12-12

最新评论