在使用选择结构时,以下是一些常见的错误和需要注意的地方:
<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> 💡
避坑技巧总结
==,赋值用=,不要混淆if (条件 == true) 这样的冗余写法
</aside>遇到选择结构相关问题时,可以: