1. 关于 C
1.1 C 的发展历史
1972 年,贝尔实验室的丹尼斯·里奇(Dennis Ritch)和肯·汤普逊(Ken Thompson)在开发 UNIX 操作系统时设计了 C 语言。
C语言是在B语言(汤普逊发明,现已经被弃用)的基础上进行设计,其主要目标是成为有用的语言。
1.2 C 的特点
C 可以高效运行,效率接近于汇编语言。
C 是可移植的语言,在一种系统编写的C程序可以稍加修改或不修改直接在其他系统运行。
C 强大而灵活,可以访问硬件和操作内存中的位。UNIX系统大部分是用C语言写的,其他语言比如Python、LISP、BASIC等的编译器和解释器都是用C语言编写的。
1.3 C 的标准
C 语言发展之初,并没有所谓的 C 标准。
后来美国 ANSI(美国国家标准协会)于1983年组建了委员会,在1989年正式发布了第一个C标准,即 ANSI C (C89)。
国际标准化组织于1990年采用了这套C标准发布了 ISO C (C90),除了文档细节方面,ISO C 和 ANSI C 完全一致。
另外,由于 ANSI 先公布C标准,因此业界人士通常使用ANSI C。
年份
标准
说明
1987
K&R C
即经典C,由 Brian Kernighan 和 Dennis Ritchie 在《The C Programming Language》中描述,是C语言的早期非正式标准。
1989
C89/ANSI C
由ANSI制定首个官方标准(X3.159-1989),统一了C语言的语法和库,奠定现代C基础。
1990
C90/ISO C
ISO采纳ANSI C为国际标准(ISO/IEC 9899:1990),内容与C89几乎相同,仅轻微调整。
1999
C99
ISO发布(ISO/IEC 9899:1999),引入内联函数、变长数组等新特性,增强数值处理能力。
2011
C11
ISO更新标准(ISO/IEC 9899:2011),新增多线程支持、泛型宏等,改进兼容性和安全性。
2018
C17/C18
ISO小幅修订(ISO/IEC 9899:2018),修复C11缺陷,无新功能,保持语言稳定性。
2023
C23
最新ISO标准(ISO/IEC 9899:2023),引入#elifdef、属性语法等现代化特性,简化代码编写。
1.4 C 程序示例
1
2
3
4
5
6
7
#include <stdio.h>
int main ()
{
printf ( "hello,world!" );
return 0 ;
}
2. C 的基本语法
2.1 C 代码书写规范
分号结尾 :每条语句必须以分号(;)结束,如 int a = 10;。
花括号成对 :代码块(函数、循环等)用 {} 包裹,且必须成对出现。
区分大小写 :printf 和 Printf 是不同标识符。
空格分隔 :关键字与变量间需用空格分隔,如 int a;(不可写为 inta;)。
缩进规范 :代码块内通常缩进(4空格或Tab),增强可读性(非强制)。
单行多语句 :允许一行写多条语句,用分号隔开(不推荐),如 a=1; b=2;。
注释符号 :单行用 //,多行用 /* */,注释内容不会被编译。
字符串双引号 :字符串常量必须用双引号包裹,如 "Hello"。
字符单引号 :单个字符用单引号,如 'A',存储为 ASCII 值。
变量先声明后使用 :使用变量前需声明类型,如 int a; a=5;。
2.2 C 数据类型
基本数据类型
数据类型
关键字
字节
取值范围(典型)
字符型
char
1
-128 ~ 127 或 0 ~ 255
有符号短整型
short
2
-32,768 ~ 32,767
无符号短整型
unsigned short
2
0 ~ 65,535
整型
int
4
-2,147,483,648 ~ 2,147,483,647
无符号整型
unsigned int
4
0 ~ 4,294,967,295
长整型
long
4 或 8
-2³¹ ~ 2³¹-1(32位)或 -2⁶³ ~ 2⁶³-1(64位)
无符号长整型
unsigned long
4 或 8
0 ~ 2³²-1 或 0 ~ 2⁶⁴-1
更长的整型
long long
8
-9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807
无符号更长整型
unsigned long long
8
0 ~ 18,446,744,073,709,551,615
单精度浮点型
float
4
±1.2×10⁻³⁸ ~ ±3.4×10³⁸,精度约6-7位小数
双精度浮点型
double
8
±2.3×10⁻³⁰⁸ ~ ±1.7×10³⁰⁸,精度约15-16位小数
扩展精度浮点型
long double
8, 12 或 16
范围更大,精度更高(依赖平台)
字符串
C语言中没有单独用于存储字符串的变量类型,字符串都被存储在 char 类型的数组中。
C中的字符串一定以空白符 \0 结束,所以数组的容量至少比字符串中的字符数多 1。
1
2
3
4
5
// 指定字符串变量名和大小并赋值
char greeting1 [ 5 ] = "hello" ;
// 使用[]自动推断长度
char greeting2 [] = "hello,world" ;
字符串函数
作用
strlen()
统计字符串长度(不含 \0)
strcpy(dest, src)
将 src 字符串复制到 dest(包括 \0),不检查 dest 长度。
strncpy(dest, src, n)
安全版 strcpy,最多复制 n 个字符(可能不补 \0,需手动处理)。
strcat(dest, src)
将 src 字符串追加到 dest 末尾(不检查 dest 剩余空间)。
strncat(dest, src, n)
安全版 strcat,最多追加 n 个字符(自动补 \0)。
strcmp(str1, str2)
比较 str1 和 str2(区分大小写),返回 0(相等)、<0(小于)、>0(大于)。
strncmp(str1, str2, n)
比较前 n 个字符,其余同 strcmp。
strchr(str, c)
返回 str 中字符 c 的首次出现位置(指针),未找到返回 NULL。
strrchr(str, c)
返回 str 中字符 c 的最后一次出现位置(指针)。
strstr(str, substr)
返回 str 中子串 substr 的首次出现位置,未找到返回 NULL。
strtok(str, delim)
按分隔符 delim 分割 str(首次调用传 str,后续传 NULL)。
memset(str, c, n)
将 str 的前 n 字节设为字符 c(常用于初始化或清空)。
memcpy(dest, src, n)
从 src 复制 n 字节到 dest(不处理重叠,比 strcpy 更底层)。
memmove(dest, src, n)
安全版 memcpy,处理内存重叠。
memcmp(buf1, buf2, n)
比较 buf1 和 buf2 的前 n 字节(类似 strcmp,但针对二进制数据)。
gets(src)
读取一行字符串(换行符之前)
puts(src)
输出一行字符串