B73
编译错误与逻辑错误
引入
章前总览 程序不对,先分清两类问题:编译错误(语法错,编不过去)和逻辑错误(能运行,结果不对)。
逻辑链条:
- C1:两类错误怎么区分
- C2:常见编译错误
- C3:常见逻辑错误
1 C1. 编译错误 vs 逻辑错误
编译错误也叫语法错误:违反了 C++ 规则,编译阶段就能发现,程序无法运行。
编译错误例子
int a = 4.5 % 2; // % 两侧须是整型/字符型
char c = "H"; // 不能把字符串赋给 char(应用 'H')
逻辑错误
- 能编译、能运行,但算法或写法错了,结果不对。
- 例:闰年条件写成
(year%4==0 && year%100!=0) && year%400==0(过严)。 - 例:该写
==却写成了=。
2 C2. 常见编译错误(速查)
部分涉及数组、函数等后学内容,学到时可以回来对照。
清单
- 标识符未定义:变量/函数未定义、拼写错、缺头文件;复合语句里定义的变量外面不能用。
- 标识符重复定义:同一作用域不能同名;全局与局部可同名(但不建议)。
- 定界符不当:()[]{}<>、'字符'、\"字符串\" 不匹配。
- 控制结构忘加圆括号;语句缺分号(尤其 do-while 末尾);非法运算(浮点取模等)。
- 关键字拼错(for→four);scanf 忘写 &(初学建议用 cin)。
命名小建议
- 变量名短一点;少用字母 o(像 0)、小写 l(像 1)。
3 C3. 常见逻辑错误(速查)
编译器不会报逻辑错误,要靠测试和调试发现。
运算符误用
while (a = 25) a++; // 本意 a==25,写成赋值 → 死循环
// a<b<c 不是“b 在 a、c 之间”
// 除数、取余的右操作数不能为 0
- 局部变量不会自动初始化,值可能随机。
- 多组测试前,相关变量要重新初始化。
- 内外同名变量(作用域交错)容易用错那个 i。
- break/continue 用错;switch 漏 break;if-else 配对错。
- 数组下标越界编译不报;多写一个分号变成空语句。
多一个分号
if (a % 3 == 0); // if 到此结束
i++; // 无论是否整除都会执行
小结
先问自己:
编不过 → 查语法/拼写/括号/分号
能跑但结果怪 → 查 ==/=、初始化、作用域、空语句
✓
里程碑达成:
下一节:怎么测程序、评测结果缩写是什么意思。