C 语言书

易错库

对照错误/正确写法,理解 why 后在自己代码里搜一遍。

1. if (x = 1)

错误正确
if (x = 1)if (x == 1)

为什么:左边是赋值,永远把 1 写入 x 且条件为真。要比较用 ==。

2. 忘写 & 读入

错误正确
scanf("%d", n);scanf("%d", &n);

为什么:scanf 需要地址。漏 & 往往直接段错误或未定义行为。

3. 数组下标写到 n

错误正确
for (i = 0; i <= n; i++) a[i] = 0;for (i = 0; i < n; i++) a[i] = 0;

为什么:长度 n 的合法下标是 0..n-1。用 < n 而不是 <= n。

4. 字符串数组太短

错误正确
char s[3] = "abc";char s[4] = "abc";

为什么:"abc" 还要放 \0,共 4 字节。太短会越界。

5. 整数除丢掉小数

错误正确
float avg = sum / n;float avg = (float)sum / n;

为什么:sum/n 若都是 int,结果是整数。先转 float 再除。

6. 函数改不了外面变量

错误正确
void f(int x){ x=1; } f(n);void f(int *x){ *x=1; } f(&n);

为什么:传值是副本。要改实参就传指针,或 return 新值。

7. 循环变量不更新

错误正确
while (i < 10) { printf("%d", i); }while (i < 10) { printf("%d", i); i++; }

为什么:条件永真且 i 不变 → 死循环。体里要有 i++。

8. 宏缺括号

错误正确
#define SQ(x) x*x#define SQ(x) ((x)*(x))

为什么:SQ(1+2) 会变成 1+2*1+2=5 而不是 9。多加括号。

9. fopen 不判空

错误正确
FILE *fp = fopen("a.txt","r"); fgets(...);FILE *fp = fopen("a.txt","r"); if(!fp) return 1;

为什么:文件不存在或无权限时 fp 为 NULL,直接用会崩溃。

10. strcmp 直接当布尔

错误正确
if (strcmp(a,b)) 相同;if (strcmp(a,b) == 0) 相同;

为什么:strcmp 相等时返回 0(C 里 0 为假)。要写 == 0 才是「相同」。