C 词条(191 条)
预处理
#include在编译前把指定头文件的内容复制进来,像做菜前先打开工具箱,把要用的铲子勺子摆上台。
#define在编译前给某个名字做全文替换,像写论文时把所有“AI”批量替换成“人工智能”。
#undef取消一个已经用 #define 创建的宏名字,让它在后续代码中不再有效。
#ifdef如果指定的宏名字已经被 #define 定义过,就保留它和对应 #endif 之间的代码参与编译。
#ifndef如果指定的宏名字还没有被定义,就保留它和对应 #endif 之间的代码参与编译。
#if如果常量表达式的值为真(非0),就保留它和对应 #endif 之间的代码参与编译。
#else配合 #if、#ifdef、#ifndef 使用,当前面的条件不成立时,保留它和 #endif 之间的代码参与编译。
#elif当前面的 #if 或 #elif 条件都不成立时,再判断这个新条件,成立就保留对应代码参与编译。
#endif结束一个 #if、#ifdef、#ifndef、#elif 或 #else 条件编译块。
#pragma向编译器发送实现定义的特殊指令,控制一些非标准的具体行为。
#error让预处理器在这里停下来,并输出你写的错误信息,强制编译失败。
预处理指令以 # 开头的预处理器指令总称,在编译前先做文本替换、条件选择或文件包含。
头文件
stdio.hC 标准输入输出库的头文件,包含 printf、scanf、文件读写等函数声明。
stdlib.hC 通用工具库的头文件,包含动态内存分配、随机数、整数转换、程序退出等。
string.hC 字符串处理库的头文件,包含复制、拼接、比较、求长度等函数。
stdbool.hC99 引入的布尔类型头文件,定义 bool、true、false 三个名字。
math.hC 数学库的头文件,包含 sqrt、pow、sin、cos 等数学函数声明。
limits.hC 整数极限头文件,提供 CHAR_BIT、INT_MAX、LONG_MIN 等编译期常量。
stdint.hC99 固定宽度整数头文件,提供 int32_t、uint64_t 等大小确定的类型。
ctype.hC 字符处理头文件,包含判断字符类别和大小写转换的函数。
time.hC 日期和时间头文件,包含 time、clock、strftime 等函数和 time_t 类型。
assert.hC 诊断头文件,提供 assert 宏,用于在调试时检查条件必须为真。
errno.hC 错误号头文件,提供 errno 宏,记录最近一次系统调用失败的错误码。
stddef.hC 常用定义头文件,提供 NULL、size_t、ptrdiff_t 等基础名字和 offsetof 宏。
float.hC 浮点数极限头文件,提供 FLT_MAX、DBL_EPSILON 等 float、double 的极限值。
关键字
auto声明自动存储期的局部变量;现代 C 里几乎不写它,C23 起还用于类型推断。
break立刻跳出当前循环或 switch,像按下紧急停止按钮:只停自己这一台机器,不波及外层。
caseswitch 里的一个具体分支标签,像电梯里某个楼层的按钮:值对上了,门就朝这开。
char声明一个字符变量,像快递柜的一个格子,只装得下一张小卡片(一个字符)。
const给变量贴“只读”标签:初始化后不能被重新赋值,像博物馆展品只能看不能摸。
continue跳过本次循环剩下的步骤,直接进入下一轮,像流水线剔除一个次品后继续生产。
defaultswitch 语句里所有 case 都不匹配时执行的默认分支。
do先执行循环体一次,再判断要不要继续,像先尝一口菜再问要不要加辣:至少做一次。
double声明双精度小数,像用游标卡尺量长度:占内存更大,但能保留更多有效数字。
elseif 条件不成立时的备选通道,像自动售货机:有钱出货,没钱就退到“请投币”提示。
enum给一组整数起有意义的名字,像给菜单编号:红烧肉的编号是 0,糖醋排骨是 1。
extern声明一个变量或函数在别处定义,告诉编译器在当前文件外去找它。
float声明单精度小数,像用普通尺子量长度:够快够省地方,但有效数字比 double 少。
for把一段代码按预定次数重复执行,像洗衣机设定循环:设置初始状态、停止条件、每次变化。
goto无条件跳转到同一函数内某个标签所在的位置继续执行。
if根据条件决定走哪条路,像红灯停绿灯行:条件为真(非0)才执行后面的语句。
inline建议编译器把函数调用处直接展开成函数体,减少函数调用的跳转开销。
int声明一个整数变量,像给学生编学号:只能挂整数学号,不能带小数点。
long声明长整型变量;它保证至少和 int 一样宽,但具体大小由实现决定。
register建议编译器把变量存放在 CPU 寄存器中以加快访问;现代编译器优化能力很强,已很少需要。
restrict告诉编译器该指针是访问它所指数据的唯一且独立的方式,便于优化。
return结束函数并把结果送回调用处,像外卖员把餐送到后打卡下班。
short声明短整型变量,通常占用比 int 更少的字节。
signed声明有符号整数类型,可以表示正数、负数和零。
sizeof在编译期量出类型或变量占多少字节,像裁缝量布料:不用真的做衣服,只看尺寸。
static让局部变量的生命周期贯穿整个程序运行,像教室里的固定储物柜:函数结束也不清空,下次来还在。
struct把不同类型的数据打包成一个新类型,像学生档案袋:袋里同时装姓名、年龄、成绩。
switch把一个整数表达式的值当作门牌号,直接跳到对应的 case 房间,像多层电梯按楼层键。
typedef给已有类型起个别名,像给长名字取外号:以后写外号就相当于写原名。
union定义一种特殊类型,它的所有成员共享同一块内存空间,同一时间只有一个成员有效。
unsigned声明无符号整数,只能表示零和正数,像只有正页码的书:页码从 0 开始,最大页码更大。
void表示“空”或“没有”,像信封上写“此函无回执”:函数不返回值,或者参数列表明确不写。
volatile告诉编译器该变量可能被程序外部因素改变,不要优化掉对它的读写。
while先检查条件,成立再反复执行,像游乐园检票:票有效才能进,进去后可能再排队。
_BoolC99 引入的布尔类型,只能保存 0 或 1,赋值非 0 值会自动变成 1。
_AtomicC11 引入的原子类型说明符,保证多线程读写该变量时不会被拆成中间状态。
_Static_assertC11 引入的编译期断言,如果条件不成立,编译器会报错并显示信息。
_NoreturnC11 引入的函数说明符,告诉编译器这个函数不会正常返回到调用处。
运算符
=赋值运算符,把右边表达式的值存进左边的变量。
==相等比较运算符,判断两边是否相等,相等为真(1),不等为假(0)。
!=不等比较运算符,判断两边是否不相等,不相等为真。
<小于比较运算符,判断左边是否小于右边。
>大于比较运算符,判断左边是否大于右边。
<=小于等于比较运算符,判断左边是否小于或等于右边。
>=大于等于比较运算符,判断左边是否大于或等于右边。
+算术加法运算符,把两个数相加;一元用时表示正数。
-算术减法运算符,两数相减;一元用时表示负数。
*做乘法时像普通计算器;声明指针时像给变量贴上“地址专家”标签;解引用时像按地址去房间里拿东西。
/除法运算符,两个整数相除会截断小数部分。
%取余运算符,返回整数相除后的余数。
++自增运算符,让变量的值加 1。
--自减运算符,让变量的值减 1。
+=复合赋值运算符,把右边加到左边变量里,是 a = a + b 的简写。
-=复合赋值运算符,从左边变量里减去右边,是 a = a - b 的简写。
*=复合赋值运算符,左边变量乘以右边,是 a = a * b 的简写。
/=复合赋值运算符,左边变量除以右边,是 a = a / b 的简写。
%=复合赋值运算符,左边变量对右边取余,是 a = a % b 的简写。
&&逻辑与运算符,两边条件都为真(非0)时结果才为真。
||逻辑或运算符,只要两边条件有一个为真(非0)结果就为真。
!逻辑非运算符,把真(非0)变成 0,把假(0)变成 1。
&单目用时像查号台,取变量的地址;双目用时像按位“与”筛子,两位都为1才留1。
|按位或运算符,两个操作数对应位只要有一个是 1,结果就是 1。
^按位异或运算符,两个操作数对应位不同为 1,相同为 0。
~按位取反运算符,把操作数的每个二进制位 0 变 1、1 变 0。
<<左移运算符,把操作数的所有位向左移动,右边补 0。
>>右移运算符,把操作数的所有位向右移动。
<<=左移复合赋值运算符,把左边变量左移后再存回,是 a = a << n 的简写。
>>=右移复合赋值运算符,把左边变量右移后再存回,是 a = a >> n 的简写。
&=按位与复合赋值运算符,是 a = a & b 的简写。
|=按位或复合赋值运算符,是 a = a | b 的简写。
^=按位异或复合赋值运算符,是 a = a ^ b 的简写。
?三元条件运算符的开始,根据条件真假从两个值中二选一。
:三元条件运算符中分隔两个选项;也用于 switch 的 case 和 default 标签后。
->通过结构体指针访问成员,像用遥控器开柜子抽屉:不用走过去,直接按遥控器打开。
符号
.成员访问运算符,通过结构体或联合体变量直接访问它的成员。
(圆括号,用于函数调用、改变运算优先级、类型强制转换或控制语句条件。
)圆括号的右半部分,与左圆括号配对使用。
[左方括号,用于定义数组和通过下标访问数组元素。
]右方括号,与左方括号配对使用。
{左花括号,标志函数体、循环体、条件分支或初始化列表的开始。
}右花括号,与左花括号配对,标志一段代码或一组聚合数据的结束。
;语句结束符,标志一条语句的结束。
,逗号运算符/分隔符,用于分隔列表中的多个表达式或声明。
...省略号,表示函数接受可变数量的参数,或表示初始化列表等中的省略。
输入输出
printf按格式把内容打印到屏幕,像往蛋糕模具倒面糊:模具有几个坑(占位符),就倒几勺料。
scanf从键盘按格式读取数据并存进变量,像快递员按地址把包裹放进对应格子。
sprintf按格式把数据写进字符数组,不打印到屏幕,常用于构造字符串。
snprintf按格式把数据写进字符数组,并限制最多写入多少字节,避免缓冲区溢出。
sscanf从一个字符串里按格式解析数据,存进变量,像从一句话里拆出数字。
puts把字符串输出到屏幕,并在末尾自动加一个换行符。
putchar把单个字符输出到屏幕。
getchar从标准输入读取一个字符,返回它的 ASCII 码;读到末尾返回 EOF。
fputs把字符串写到指定的文件流,不会自动追加换行。
fgets从指定文件流最多读取一行字符串,能限制最大长度,防止溢出。
perror先输出你给的提示字符串,再输出最近一次系统调用产生的错误信息。
fflush立刻把输出流缓冲区里的数据刷到目标设备(如屏幕或文件)。
fopen按指定模式打开一个文件,成功返回文件指针,失败返回 NULL。
fclose关闭一个已经打开的文件,释放相关资源。
fread从文件读取若干块二进制数据到内存。
fwrite把内存中的若干块二进制数据写到文件。
fseek把文件读写位置移动到指定地方,方便随机访问文件。
remove删除指定路径的文件。
内存管理
malloc在堆上申请指定字节数的内存,成功返回首地址,失败返回 NULL。
calloc申请能放指定个数、每项指定大小的内存,并自动把所有字节清零。
realloc把已经申请的内存块改成新的大小,可能搬到新地址。
free释放 malloc/calloc/realloc 申请的内存,把它还给系统。
exit立即结束整个程序,返回一个状态码给操作系统。
abort异常终止程序,通常会产生 SIGABRT 信号,不调用 atexit 注册的清理函数。
qsort用快速排序算法对数组进行排序。
常用工具/随机
rand返回一个 0 到 RAND_MAX 之间的伪随机整数。
srand给伪随机数生成器设置种子,决定后续 rand 产生的序列。
时间
time获取当前日历时间,通常返回自 1970-01-01 00:00:00 UTC 起的秒数。
字符串函数
strlen计算字符串的长度,不包括结尾的 \0。
strcpy把源字符串复制到目标字符数组,包括结尾的 \0。
strncpy最多复制指定个数的字符到目标数组,不会自动补 \0。
strcat把源字符串拼接到目标字符串末尾,目标数组必须有足够空间。
strcmp按字典序比较两个字符串,返回负数、0 或正数。
strchr在字符串中查找某个字符第一次出现的位置,返回指向该字符的指针。
strstr在字符串中查找子串第一次出现的位置,返回指向该位置的指针。
strtok把字符串按分隔符切成一段段,每次调用返回下一段。
memcpy把一块内存的内容原样复制到另一块内存,源和目标不能重叠。
memmove把一块内存复制到另一块内存,即使源和目标重叠也能正确处理。
memset把一块内存的每个字节都填成同一个值。
memcmp按字节比较两块内存的内容,返回负数、0 或正数。
atoi把字符串转换成 int 类型的整数。
atof把字符串转换成 double 类型的浮点数。
strtol把字符串转换成 long 类型的长整数,可指定进制,并检测结束位置。
数学函数
abs求整数的绝对值。
sqrt求一个非负数的平方根。
pow求一个数的指定次幂。
fabs求浮点数的绝对值。
floor向下取整,返回不大于参数的最大整数。
ceil向上取整,返回不小于参数的最小整数。
sin求正弦值,参数是弧度而不是角度。
cos求余弦值,参数是弧度而不是角度。
tan求正切值,参数是弧度而不是角度。
exp求 e(自然对数的底)的指定次幂。
log求自然对数 ln,即以 e 为底的对数。
fmod求浮点数相除后的浮点余数。
字符判断
常用工具
assert调试宏,断言条件必须为真,否则程序会报错并终止。
常用常量
常用类型
size_t表示对象大小或数组下标的无符号整数类型。
FILE标准库定义的文件流类型,通过文件指针操作文件。
通用兜底
字符串双引号字符串字面量,本质是以 \0 结尾的字符数组。
数字数字常量或字面量,直接写在代码里的数值。
注释单行注释,// 后面的内容不执行,仅用于说明。
块注释块注释,/* 和 */ 之间的所有内容都不执行。
变量变量,程序运行中用来存数据的命名内存空间。
函数调用函数调用,让函数执行一段功能并可能返回结果。
方法成员访问,通过结构体变量用点号访问其成员。
属性结构体或联合体的属性字段,通过变量名.字段名访问。
缩进缩进,C 语言靠大括号定结构,缩进只影响可读性。
运算符运算符,用来对操作数进行计算、比较、赋值或位操作。
打开代码点读机,粘贴代码点词即查 →