C语言总复习:高频难点+必背考点(附可直接运行代码)
目录(点击跳转)
- 一、数据类型与 signed/unsigned(必考坑点)
- 二、sizeof 核心考点(90%概率考)
- 三、变量:局部 vs 全局(内存+优先级)
- 四、算术运算符:整除、取模(高频错题)
- 五、++/-- 前置 vs 后置(必考)
- 六、强制类型转换(隐式+显式)
- 七、printf 格式化(输出格式必背)
- 八、scanf 重难点(90%人错)
- 九、僵尸进程 & 孤儿进程(操作系统高频)
- 十、考场/面试秒杀口诀
一、数据类型与 signed/unsigned
1. char 默认有符号还是无符号?
char不等于signed char,是否带符号由编译器决定。int默认等价于signed int。
#include<stdio.h>intmain(){chara=0x80;if(a<0)printf("char 是有符号\n");elseprintf("char 是无符号\n");return0;}2. 无符号数永远 ≥ 0,比较极易踩坑
无符号数运算结果一定是无符号,不会出现负数。
#include<stdio.h>intmain(){unsignedinta=10;if(a-20>0){printf("成立!无符号数永不为负\n");}return0;}二、sizeof 核心考点
1. sizeof 是运算符,不是函数
2. sizeof不执行表达式,只看类型
#include<stdio.h>intmain(){shorts=2;intb=10;printf("%zd\n",sizeof(s=b+1));// 结果:2printf("s=%d\n",s);// s 仍为 2,表达式未执行return0;}3. 常见类型大小(64位环境)
| 类型 | 32位环境 | 64位环境 |
|---|---|---|
char | 1 | 1 |
short | 2 | 2 |
int | 4 | 4 |
long | 4 | 4/8 |
long long | 8 | 8 |
float | 4 | 4 |
double | 8 | 8 |
指针(void*) | 4 | 8 |
三、变量:局部 vs 全局(内存+优先级)
1. 同名变量,局部优先于全局
#include<stdio.h>intn=1000;// 全局变量intmain(){intn=10;// 局部变量printf("%d\n",n);// 输出:10return0;}2. 内存分布
- 局部变量 →栈区
- 全局/静态变量 →静态区
- 动态分配(malloc)→堆区
四、算术运算符:整除、取模(高频错题)
1. 整数除法是整除,直接丢弃小数
#include<stdio.h>intmain(){intscore=5;// 错误:整数整除,结果为0score=(score/20)*100;printf("错误结果:%d\n",score);// 正确:转为浮点数除法score=(score/20.0)*100;printf("正确结果:%d\n",score);return0;}2. % 取模:结果符号由被除数决定
11 % 5 = 1 11 % -5 = 1 -11 % 5 = -1 -11 %-5 = -1五、++/-- 前置 vs 后置(必考)
口诀:
- 前置++:先+1,再使用
- 后置++:先使用,再+1
#include<stdio.h>intmain(){// 前置++inta=10,b;b=++a;printf("前置:a=%d, b=%d\n",a,b);// a=11, b=11// 后置++intx=10,y;y=x++;printf("后置:x=%d, y=%d\n",x,y);// x=11, y=10return0;}六、强制类型转换(隐式+显式)
- 隐式转换:编译器自动转,易丢精度、有警告
- 显式强转:
(类型)值,无警告,截断而非四舍五入
#include<stdio.h>intmain(){inta=3.14;// 隐式转换,警告intb=(int)3.14;// 显式强转,无警告printf("a=%d, b=%d\n",a,b);// 均为3return0;}七、printf 格式化(输出格式必背)
#include<stdio.h>intmain(){intnum=123;doublef=123.45;printf("%5d\n",num);// 宽度5,右对齐: 123printf("%-5d\n",num);// 左对齐:123printf("%+d\n",num);// 显示正负号:+123printf("%.2f\n",f);// 保留2位小数:123.45printf("%6.2f\n",f);// 总宽6,小数2位:123.45printf("%%\n");// 输出%return0;}八、scanf 重难点(90%人错)
1. 普通变量必须加 &(数组名/指针除外)
2. %c 会读取空格/换行,前面加空格跳过空白
3. %*c:赋值忽略符,跳过任意分隔符
4. 返回值:成功读取的变量个数
#include<stdio.h>intmain(){inta,b,y,m,d;charch;// 1. 普通变量取地址scanf("%d %d",&a,&b);// 2. %c 跳过空白scanf(" %c",&ch);// 3. 忽略分隔符(支持2025-01-01或2025/01/01)scanf("%d%*c%d%*c%d",&y,&m,&d);// 4. 返回值intr=scanf("%d",&a);printf("r=%d\n",r);// 成功1个返回1,失败返回0,结束返回-1return0;}九、僵尸进程 & 孤儿进程(操作系统高频)
1. 僵尸进程
- 条件:子进程先死,父进程存活,父未调用 wait/waitpid
- 特点:残留PCB,占用进程号,不释放资源
- 核心:父进程等待子进程回收
2. 孤儿进程
- 条件:父进程先死,子进程存活
- 特点:被
init(PID=1)收养,自动回收,不会变僵尸
十、考场/面试秒杀口诀
- char 有符号看编译器,int 默认有符号
- 无符号数运算永不为负
- sizeof 不算表达式,只看类型
- 局部变量优先全局变量
- 整数除法是整除,想算小数用浮点数
- 取模符号看被除数
- 前置++先加后用,后置++先用后加
- scanf 变量要&,%c前面加空格跳空白
- 强转是截断,不是四舍五入
- 僵尸:子死父不收;孤儿:父死子被收养
要不要我再帮你生成一份配套的可直接复制的Markdown目录,方便你放在文章开头快速跳转?