跳到主要内容
  1. 所有文章/

C 学习笔记(一)

·2054 字·约 5 分钟

简介 #

C 语言是一种 通用 的、面向过程 的计算机程序设计语言,具有 高效灵活功能丰富表达力强 和较高的 可移植性 等特点。

它最初是 1972 年,贝尔实验室的丹尼斯·里奇 (Dennis Ritch) 和肯·汤普逊 (KenThompson) 为了移植和开发 UNIX 操作系统,以 B 语言为基础,在贝尔实验室设计、开发出来的。

因为 C 语言所产生的代码运行速度非常接近于汇编语言编写的代码的运行速度,所以 C 语言最初用于系统开发工作,尤其是组成操作系统的程序。Windows、macOS、Linux、Unix 等操作系统的很多底层都或多或少都使用了 C 语言编写。

C 语言对后来众多程序设计语言,如:C++、Objective-C、Java、C# 等都有一些影响,并且像 FORTRAN、Perl、Python、Pascal、LISP、Logo、BASIC 等语言的编译器或解释器都是由 C 语言编写的。

标准 #

K&R C #

1978 年,丹尼斯·里奇布莱恩·柯林汉 合作出版了《C程序设计语言》的第一版。书中介绍的 C 语言标准也被 C 语言程序员称作「K&R C」,第二版的书中也包含了一些 ANSI C 的标准

K&R C 主要引入了以下语言特性:

  • 标准 I/O
  • srtuct 类型
  • long int 类型
  • unsigned int 类型
  • 将运算符 =+=- 改为 +=-= (前者会使编译器处理上产生混淆)

ANSI C(C89) #

1989 年,为避免各开发厂商使用不同 C 语言语法而产生的差异,美国国家标准学会 ( American National Standards Institute,简称 ANSI)制订了一套完整的 C 语言国际标准语法——ANSI C,编号为 ANSI X3.159-1989,所以这个版本也被称为 C89

在标准化的同时,拓展了 K&R C 并且增加了一些新特性:

  • void 函数
  • 函数返回 struct/union 类型
  • void 数据类型

ISO C(C90) #

1990年,国际标准化组织(ISO) 在 ANSI C 标准上进行少量修改,最终制定了 ISO 9899:1990 规范的 C 语言国际标准,这个版本也被称为 C90

在之前 C 语言国际化标准上做的改进有:

  • 增加了真正的标注库
  • 新的预处理命令和特性
  • 函数圆弧形允许在函数中指定参数类型
  • 新的关键字:constvolatilesigned
  • 宽字符、宽字符串和多字节字符

在 1994 年,又做了以下改进:

  • 3 个新的标准库头文件 iso646.hwctype.hwchar.h
  • 几个新的记号与预定义宏,用于对国际化提供更好的支持
  • printf/sprintf 函数一系列新的格式代码
  • 用于多字节字符和宽字节字符的大量的函数和一些类型与常量

C99 #

在 ANSI 的标准确立后,C 语言的规范在一段时间内没有大的变动,然而 C++ 在自己的标准化创建过程中继续发展壮大。《标准修正案一》在 1994 年为 C 语言创建了一个新标准,但是只修正了一些 C89 标准中的细节和增加更多更广的国际字符集支持。不过,这个标准引出了 1999 年 ISO 9899:1999 的发表,它通常被称为 C99,C99 被 ANSI 于 2000 年 3 月采用

C11 #

2011 年 12 月 8 日,ISO 正式发布了新的 C 语言的新标准 C11,之前被称为 C1X,官方名称为 ISO/IEC 9899:2011

新的标准提高了对 C++ 的兼容性,并增加了一些新的特性。这些新特性包括泛型、多线程、带边界检查的函数、匿名结构等

C18 #

对 C11 进行了补充和修正

C2x #

引入了一些新特性,将有望成为下一个 C 语言的 ISO 标准,在其最新标准草案 C2x 标准上将加入符合 IEEE 标准的十进制浮点数,这使得计算机能够精确地储存浮点数

结构 #

组成 #

一个 C 程序主要组成部分为:

  • 预处理指令
  • 函数
  • 变量
  • 语句/表达式
  • 注释

以 C 语言的第一个程序「Hello World!」为例("//" 后面的内容在此处用于注释,后面会使用标准的 C 语言注释)

// 预处理指令
#include<stdio.h>
int main()                         // int main()是主函数,程序从这开始执行
{       
    printf("Hello, World!\n");     // printf()函数,打印输出"Hello,Wolrd!"
    return 0;                      // 终止main()函数,并返回0
}
/* 第一个C程序:"Hello World!" */      // 由"/*...*/"包裹起来的这部分是注释内容

第一个 C 程序输出为:

Hello World
Hello World

步骤 #

把编写 C 语言的过程分为以下步骤:

C Step
C Step

这是理想状态下的步骤,但在实际使用过程中,尤其是在较大型的项目中,可能要做一些重复的工作或者根据下一个步骤的情况来调整或改进上一个步骤.

C语言的编译 #

C 语言是一种编译型语言,源码本身无法直接执行,必须通过编译器编译后生成二进制的可执行文件,才能执行。编译器将代码从文本翻译成二进制指令的过程,就称为编译阶段,又称为「编译时」(compile time),跟运行阶段(又称为「运行时」)相区分。

C 语言的源码文件,后缀名为 .c,它实际上是一个纯文本文件,可以使用任何文本编辑器直接编辑里面的源代码内容,在 Linux 和 macOS 下可以通过软件包管理器安装 GCC 编译器、GDB 调试器,Windows 下可以安装 Cygwin 或者 MingW 等包含 C 语言所需的工具链来配置 C 语言编程环境,也可以直接在终端环境中编译、运行 C 程序。

对于一个最简单的 C 程序,保存在 hello-world.c

#include <stdio.h>
int main() {
  printf("Hello World\n");
  return 0;
}

使用 gcc 编译器对源代码进行编译和运行

# 使用 gcc 编译
gcc hello-world.c
# 未指定输出文件名的情况下为 a.out 文件(assembler output)
# 执行该文件
./a.out
Hello World # 输出结果

可以指定编译输出文件的名称,比如

gcc hello-world hello-world.c
# 执行该文件
./hello-world
Hello World # 输出结果

在使用 gcc 编译的命令的时候还可以指定编译使用的 C 标准,比如使用 C11 标准

gcc -std=c11 hello-world.c

参考资料 #

Dejavu Moe
作者
Dejavu Moe
Not for success, just for growing.