C语言标准

演进历史:

C语言是为了开发Unix系统而创建的,一开始,并没有形成所谓的C标准,C语言最初的开发者是Dennis M. Ritchie和Kenneth Lane Thompson。1973年,Unix系统的核心正式采用C语言改写。1987年,Brian W. Kernighan/Dennis M. Ritchie合著的《The C Programming Language》第一版是公认的C标准,通常称为K&R C或经典C,但它没有定义C库。C语言必须依赖标准库,由于缺乏官方标准,UNIX实现提供的库已经成为了事实上的标准库。

考虑到标准化的重要,美国国家标准协会(ANSI)于1983年组建了一个委员会,并于1989年正式发布第一个C标准C89,也称为ANSI C。该标准定义了C语言和C标准库。国际标准化组织于1990年采用了这套标准,成为国际标准(ISO/IEC 9899:1990),故ANSI/ISO标准的这一版本通常叫做C89或C90。

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

1994年,ANSI /ISO联合委员会(C9X委员会)开始修订C标准,最终在1999年发布了ISO/IEC 9899:1999,简称“C99”。一般将C99之后的C语言标准称为“现代C语言”。

2007年,C语言标准委员会又重新开始修订C语言,2011年正式发布C11(ISO/IEC 9899:2011)。

2018年6月发布的ISO/IEC 9899:2018,被称作C17(也被称为C18),用来替代C11标准。C17没有引入新的语言特性,只对C11进行了补充和修正。

目前的最新标准为C23,在C99和C11基础上进行了很多改进。

C标准的文档:

C语言的正式标准文档,是要付费,但其草案文档(跟正式文档差不多)可以免费获取。

C89:文档未知。

C99(2007年的N1256文档,应该不对):

https://open-std.org/JTC1/SC22/WG14/www/docs/n897.pdf

C11:https://open-std.org/JTC1/SC22/WG14/www/docs/n1570.pdf

C17:https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2310.pdf

C23:

https://www.open-std.org/jtc1/sc22/wg14/www/docs/n3096.pdf

https://www.open-std.org/jtc1/sc22/wg14/www/docs/n3047.pdf

C语言标准库也很重要,头文件参考:https://en.cppreference.com/w/c/header 

版本间的改动:

关于版本间的改动,详细内容,可以查看上一节的标准文档。另外,可以从编译器的角度去看版本间的改动,如Clang - C Programming Language Status

C89 的主要改动包括:

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

C95 的主要改动包括:

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

C99 的主要改动包括:

  • 复数(complex);
  • 整数(integer)类型扩展;
  • 变长数组;
  • Boolean 类型;
  • 非英语字符集的更好支持,支持国际化编程,如供多种方法处理国际字符集;
  • 浮点类型的更好支持;
  • 提供全部类型的数学函数
  • C++ 风格注释(//)。

C11的主要改动包括:

C23部分改动(以下面的代码示例来说明)

// Only include stdio.h if it exists
#if __has_include (<stdio.h>)
    #include <stdio.h>
#endif

#include <stdlib.h>

[[deprecated]]
void f() {}

[[nodiscard]]
int g(int x) 
{
    return x + 1;
}

int main() 
{
    f(); // compile-time warning: 'f' is deprecated
    g(1); // compile-time warning
    auto x = 0b1111;
    typeof(x) y = 1'000'000; // type of y is the same as x
    printf("%d\n", x); // prints 15
    printf("%d\n", y); // prints 1000000
    constexpr int N = 10;
    // compile-time asserts using static_assert
    static_assert (N == 10);
    bool a[N]; // array of N booleans
    for (int i = 0; i < N; ++i) 
    {
        a[i] = true;
    }
    printf("%d\n", a[0]); // prints 1
}
  • __has_include来自C++17
  • 属性[[deprecated]]来自C++14
  • 属性[[nodiscard]]来自C++17,指明不能忽略或者丢弃函数返回值;
  • 支持二进制形式的初始化,来自C++14
  • 支持通过typeof操作符返回表达式的类型;
  • 支持单引号分隔表示数字,如1’000’000表示十进制的1000000,来自C++14
  • 支持constexpr关键字,实现编译时计算,来自C++11
  • 支持static_assert关键字,实现编译时断言,来自C++11
  • 新增关键字truefalse
  • __STDC_VERSION__被定义为202311L(之前是201710L)。

总结和The Spirit of C:

下面链接提到的C语言精神,应该是C语言始终保持简单,高效的原因吧;上一节的改动记录也能反映这种精神;基于这种精神,我们看到,C标准的演进其实是非常缓慢和慎重的。

链接:WG 14 N 2086 -- C2x Charter

The spirit of C:

(a) Trust the programmer.

(b) Don't prevent the programmer from doing what needs to be done.

(c) Keep the language small and simple.

(d) Provide only one way to do an operation.

(e) Make it fast, even if it is not guaranteed to be portable.

(f) Make support for safety and security demonstrable.

C语言是一门高级语言,但它抽象程度不如C++/Java等,它足够贴近硬件,又与Unix系统同宗同源;C语言可以完全没有runtime的支持,它的标准库很基础,生成的目标代码比较可控。所以C语言简单高效,应用范围极广,是系统内核采用的基础语言,也是硬件之上的基础语言。

一般,新出一套硬件,先用C写好驱动,写好操作系统,写好库,然后在此基础上用其他高级语言如JAVAPYTHON来写程序。

一般,越高级的语言越抽象,编译器做的事情可能越多,效率可能受影响。高级语言往往是面向对象的,一行源代码,最后可能生成很多机器码,比如一个C++class定义,编译器帮你生成一堆构造函数和析构函数;一行C++对象定义源码,编译器帮你添加代码调用构造函数和析构函数。所以,我个人理解:C++ = C + 面向对象设计;但其实C++还提供了更丰富的类库和泛型支持等。

C语言在开发效率,运行效率,代码可读性等达到很好的平衡。

《完》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值