C 语言基本介绍
C 语言历史
丹尼斯·里奇(Dennis Ritch)和肯·汤普逊(Ken Thompson)开发 Unix 时在 B 语言基础上设计了 C 语言,应用于操作系统、驱动、数据库等底层开发,是一门偏底层的编程语言。
C 语言标准
- 最初并没有所谓的 C 标准,第一版公认的 C 标准是 The C Programming Language 的第一版(也称 K&R C 或经典 C)。
- ANSI 于 1989 年公布的一套新标准定义了 C 语言和 C 标准库(ANSI C),ISO 在 1990 采用该标准(ISO C),因此 ANSI/ISO 标准通常称为 C89 或 C90。
- 1999 年 ANSI/ISO 联合委员会在遵循 C90 基础上最终发布 C99 标准。
- 2011 年发布 C11 标准,委员会从此开始不那么强调「信任程序员」。
- …
C 语言的执行流程
源代码 -> 预处理 -> 编译 -> 汇编 -> 链接 -> 可执行文件
预处理器:处理头文件、宏定义等,生成预处理后的源码文件。
编译器:将源代码翻译汇编语言,同时还会检查源码中的一些错误。
汇编器:将汇编语言转为机器语言(二进制代码)。
链接器:将源代码和 C 的库函数链接。
大多数系统中,编译器运行链接器;C 编译器将源代码和 C 的库函数合并成最终的程序。
一个典型的 C 程序
#include <stdio.h>
int main(void)
{
printf("HelloWorld!\n");
return 0;
}
标准 C 定义的 main 函数两种写法:C11 5.1.2.2.1 Program startup
int main(void){/*...*/}
int mian(int argc,char *argv[]){/*...*/}
如果使用 ANSI C 之前的编译器,需要省略 void。如果使用新标准编译器,例如 C11 中
main()
这种写法是不受支持的。
C 程序顶部的信息集合称为头文件,#include <stdio.h>
是一条预处理指令,就是将 stdio.h
这个文件的内容「复制粘贴」到源代码中。
错误
语法错误:不遵循 C 语言语法,将无法通过编译。
语义错误:遵循 C 语言语法,但结果不正确。
程序状态
程序执行过程中,某定点上所有变量值的集合,时计算机当前状态的一个快照。
关键字和保留字
对于 C 语言有特殊含义,不能用作标识符。
C 语言的一些规则
注释
注释是帮助理解代码的自然语言,有三种:
/* 第一种注释:单行 */
/*
第二种注释:多行
*/
// 第三种注释:单行,C99 新增
变量声明
在 C 语言中,变量必须先声明再使用。C99 开始可以在任意位置声明后再使用,此前必须在代码块的顶部。
声明变量就是将一块内存预留给该变量存储数据。
命名
使用数字、字母和下划线命名,但第一个字符不能为数字。C90 命名长度只允许 6 个字符,C99 和 C11 允许更长的命名,但编译器只识别前 63 个字符,超出将会被截断。
OS 和 C 库常以一个或两个下划线为开头命名,因此尽量不要使用下划线作为命名开头,以防止命名冲突。
函数声明(函数原型)
void func(void);
C90 标准新增函数原型,是一种声明形式,指明了函数名、属性。早期的 C 语言支持仅指定返回类型,无需描述参数。
C 标准建议为程序中用到的所有函数提供函数原型。
总结
C Primer Plus 前两章是对 C 语言的入门概念及后续一些章节知识的概述,对于 0 基础而言非常不友好。作为 0 基础初学者,不懂可以接着往下读,不建议死磕为什么。