测评会员优惠活动进行中 · 开通 VIP,有效期内测评不限次 VIP 优惠中 · 测评不限次 立即查看
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++;           // 无论是否整除都会执行
小结

先问自己:

编不过 → 查语法/拼写/括号/分号
能跑但结果怪 → 查 ==/=、初始化、作用域、空语句
里程碑达成:

下一节:怎么测程序、评测结果缩写是什么意思。