C语言基础知识(草稿)

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 CANSI C 完全一致。 另外,由于 ANSI 先公布C标准,因此业界人士通常使用ANSI C。

年份 标准 说明
1987 K&R C 即经典C,由 Brian KernighanDennis 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;
  • 花括号成对:代码块(函数、循环等)用 {} 包裹,且必须成对出现。
  • 区分大小写printfPrintf 是不同标识符。
  • 空格分隔:关键字与变量间需用空格分隔,如 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) 输出一行字符串
updatedupdated2026-02-052026-02-05