C 语言

关注公众号 jb51net

关闭
首页 > 软件编程 > C 语言 > C89、C99、C11、C17、C2x

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

作者:贩卖月光的小女孩

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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

阅读全文