跳至主要內容

简介

Sankgao约 1690 字大约 6 分钟LanguagesC

C 语言的历史

C 语言是一种强大的专业化编程语言,最初是作为 Unix 系统的开发工具而发明的。C 语言的原型是 A 语言(ALGOL 60 语言)。

1960 年,发明的 ALGOL 60(ALGOrithmic language 60)语言,即 “算法语言 60”。ALGOL 60 语言是程序设计语言由技艺转向科学的重要标志。

1963 年,英国剑桥大学在 ALGOL 60 语言的基础上改进出了 CPL(Combined Programming Language)语言。CPL 更接近于计算机硬件一些,但规模是比较大的,很难以实现。

1967 年,英国剑桥大学的 Matin Richards 在 CPL 语言的基础上改进出了 BCPL(Basic Combined Programming Language)语言。BCPL 语言是典型的面向过程的高级语言,BCPL 的语法更加靠近机器本身,适合于开发精巧,高要求的应用程序,同时对编译器的要求也不高。最早被用做牛津大学的 OS6 操作系统上面的开发工具。后来通过美国贝尔实验室的改进和推广成为了 UNIX 上的常用开发语言——C 语言。

1969 年,美国贝尔实验室的电脑科学家肯尼斯·蓝·汤普森(Kenneth Lane Thompson)在 BCPL 语言的基础上改进出了 B 语言,这个名字取自 BCPL 中的第一个字母。B 语言是一种无数据类型语言,所有的数据都和机器字相对应,并且程序员可以直接通过内存地址操作内存。并用 B 语言写了初版 UNIX 操作系统(叫 UNICS)。

1972 年,美国贝尔实验室的丹尼斯·里奇(Dennis MacAlistair Ritchie)在 B 语言的基础上改进出了 C 语言,这个名字取自 BCPL 中的第二个字母。C 语言是一门面向过程的计算机编程语言,提供一种能以简易的方式编译、处理低级存储器、仅产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。1973 年,汤普森和里奇用它完全重写了 UNIX 操作系统。

1989 年,美国国家标准协会(ANSI)发布了第一个完整的 C 语言标准——ANSI X3.159-1989,简称 “C89” 即 “ANSI C”。

C 语言的特点

  1. 低级语言

    C 语言能够直接操作硬件、管理内存、跟操作系统对话,这使得它是一种非常接近底层的语言,也就是低级语言,非常适合写需要跟硬件交互、有极高性能要求的程序。

  2. 可移植性

    C 语言的原始设计目的,是将 Unix 系统移植到其他计算机架构。这使得它从一开始就非常注重可移植性,C 程序可以相对简单地移植到各种硬件架构和操作系统。除了计算机,C 语言现在还是嵌入式系统的首选编程语言,汽车、照相机、家用电器等设备的底层系统都是用 C 语言编程,这也是因为它良好的可移植性。

  3. 简单性

    C 语言的语法相对简单,语法规则不算太多,也几乎没有语法糖。一般来说,如果两个语法可以完成几乎相同的事情,C 语言就只会提供一种,这样大大减少了语言的复杂性。而且,C 语言的语法都是基础语法,不提供高级的数据结构,比如:C 语言没有 “类”(class),复杂的数据结构都需要自己构造。

  4. 灵活性

    C 语言对程序员的限制很少。它假设程序员知道自己在干嘛,不会限制您做各种危险的操作,您干什么都可以,后果也由自己负责。C 语言的哲学是 “信任程序员,不要妨碍他们做事”。比如:它让程序员自己管理内存,不提供内存自动清理功能。另外,也不提供类型检查、数组的负索引检查、指针位置的检查等保护措施。表面上看,这似乎很危险,但是对于高级程序员来说,却有了更大的编程自由。不过,这也使得 C 语言的 debug 不太容易。

C 语言编程规范

  • 命名规则:

    • 可以用小写字母、大写字母、数字和下划线(_)来命名。而且,名称的第 1 个字符必须是字母或下划线,不能是数字
    • 名称区分大小写
    • 函数、结构体、枚举类型、联合体类型、typedef 定义类型,以大驼峰风格命名。如:TestDemo
    • 局部变量、函数參数、宏参数、结构体中,以小驼峰风格命名。如:testdemo
    • 全局变量,以带 g_ 前缀的小驼峰风格命名。如:g_testdemo
    • 常量、宏、枚举类型、goto 标签,以全大写下划线分割风格命名。如:TEST_DEMO
  • 大括号

    • Kb&R 风格(推荐用法):开括号总是与使用它的语句在同一行上,而闭括号总是在它所关闭的语句的下一行上,并且与该语句对齐。如:

      int main(void) {
          int a = 5;
      
          if (a > 0) {
              printf("a 大于 0,a 的值为 %d\n", a);
          } else {
              printf("a 小于 0,a 的值为 %d\n", a);
          }
      }
      
    • Allman 风格:每个大括号都单独成行,并且开括号和闭括号都与使用它们的语句对齐。如:

      int main(void)
      {
          int a = 5;
      
          if (a > 0)
          {
              printf("a 大于 0,a 的值为 %d\n", a);
          }
          else
          {
              printf("a 小于 0,a 的值为 %d\n", a);
          }
      }
      
  • 指针类型 *:

    • 星号 * 可以放在类型关键字与变量名之间的任何地方

      int* foo;  // 推荐用法
      int * foo;
      int *foo;
      
    • 当出现 restrict const 时,* 前后都要空格

      char * restrict p;
      char * const VERSION;
      
  • 加空格:

    • 在逗号后面和语句中间的分号后面加空格
    • 在运算符的两边各留一个空格
    • 在关键字后面加空格
    • 在类型与指针说明符指针中间加空格
  • 不加空格:

    • 在结构体成员引用符号 .-> 左右不能加
    • 不在行尾添加空格
    • 函数名在左括号之间不能加
  • 语句必须使用分号结尾,除非有明确规定可以不写分号

  • 用 4 个空格缩进,或一个 Tab 键

  • 不要在一行中写多条语句

  • 行宽不超过 120 字符,但当代码超过 120 字符时,可以允许换行,但必须要进行同类对齐

  • 多行注释格式 /* 注释内容 */;单行注释尽量也用 /* 注释内容 */ 格式,单行注释还可以使用 // 格式