常见错误与避坑指南

在使用选择结构时,以下是一些常见的错误和需要注意的地方:

<aside> ⚠️

1. if语句后多加分号

if (radius >= 0);  // ❌ 错误:分号导致if语句体为空
{
area = radius * radius * PI;  // 这部分总会执行
}

影响: 虽不会导致编译错误,但会改变程序逻辑,是高频逻辑错误。

</aside>

<aside> ⚠️

2. 混淆赋值(=)与判断相等(==)

if (count = 1)  // ❌ 错误:这是赋值,不是判断
if (count == 1) // ✅ 正确:这才是判断相等

影响: if (count = 1) 会先将1赋值给count,然后判断赋值结果(非零即为true),导致条件永远为真。

</aside>

<aside> ⚠️

3. else匹配错误

int i = 1, j = 2, k = 3;
if (i > j)
if (i > k)
cout << "A";
else  // ⚠️ 这个else匹配的是内层if,不是外层if
cout << "B";

规则: else默认与"同一代码块中最近的未匹配if"配对,缩进不影响匹配关系。

正确写法: 若需让else与外层if匹配,使用大括号:

if (i > j) {
if (i > k)
cout << "A";
}
else  // ✅ 现在匹配外层if
cout << "B";

</aside>

<aside> ⚠️

4. 冗余的布尔判断

bool even = (number % 2 == 0);
// ❌ 冗余写法
if (even == true)
cout << "It is even.";
// ✅ 简洁写法
if (even)
cout << "It is even.";

原因: even本身就是布尔类型,无需与true比较。

</aside>

<aside> ⚠️

5. switch穿透:忘记加break

switch (day) {
case 1:
cout << "周一";
// ❌ 忘记break,会继续执行case 2
case 2:
cout << "周二";
break;
}

影响: 如果day=1,会输出"周一周二",因为没有break会"穿透"到下一个case。

正确写法:

switch (day) {
case 1:
cout << "周一";
break;  // ✅ 添加break
case 2:
cout << "周二";
break;
}

注意: 有时穿透特性是故意使用的(如多个case共享同一逻辑),但大多数情况下忘记break是错误。

</aside>

<aside> 💡

避坑技巧总结

  1. 养成良好编码习惯: 语句块总是使用大括号,即使只有一行代码
  2. 注意运算符: 判断用==,赋值用=,不要混淆
  3. 合理使用括号: 不确定优先级时,用括号明确运算顺序
  4. switch必加break: 除非故意使用穿透特性,否则每个case都要加break
  5. 简化布尔表达式: 避免 if (条件 == true) 这样的冗余写法 </aside>

调试建议

遇到选择结构相关问题时,可以: