InfoCode

C++ · 控制结构

分支结构

用59、60、89、90逐项检查条件边界,解释if/else if的首个成立分支,以及独立if与分支链的区别。

InfoCode 编写 · 技术参考见下文

在应用中练这个知识点 在应用中阅读讲解

条件与分支结构

生活中我们经常做判断:如果下雨,就带伞;否则不带。C++ 的 if 语句做的就是这件事。

基本形式:

if (条件) {
    // 条件为真时执行
} else {
    // 条件为假时执行
}

多分支(else if):

if (score >= 90) {
    cout << "优秀";
} else if (score >= 60) {
    cout << "及格";
} else {
    cout << "不及格";
}

大括号 {} 括住的是一个"代码块"。如果只有一条语句可以省略大括号,但强烈建议始终加上大括号,避免误解。

else 和同一嵌套结构中最近的、尚未匹配 else 的 if 配对;大括号可明确归属。

switch 分支:需要按整数或枚举的离散值选择操作时,可使用 switch。case 标签必须是常量表达式,default 处理没有命中的情况。case 后不会自动结束,通常加 break;故意让多个 case 共用处理时可把标签相邻排列。

先检查边界,再检查分支顺序

约定分数为0到100:90分及以上为优秀,60分及以上为通过。if / else if 链只执行第一个条件成立的分支;把较宽的条件放前面,可能挡住后面的分支。

分数score >= 90score >= 60(需要时)输出
59假假retry
60假真pass
89假真pass
90真不再检查excellent

常见错误一:把 >= 60 写成 > 60,恰好60分会走错。错误二:先写 if (score >= 60),再写 else if (score >= 90),90分已被前一支接住,无法进入优秀分支。两个独立if则可能都执行,与if/else if链不同。

运行验证:阈值前后各测一次

#include <iostream>
#include <initializer_list>
int main() {
    for (int score : {59, 60, 89, 90}) {
        if (score >= 90) { std::cout << "excellent\n"; }
        else if (score >= 60) { std::cout << "pass\n"; }
        else { std::cout << "retry\n"; }
    }
}

先预测四行结果,再运行。示例中的循环只用来重复检查四个输入。

先自己判断,再展开答案

把 >= 60改为 > 60,四个输入中哪个结果会改变?

60从pass变成retry;59、89、90的结果不变。

先检查 >= 60再else if >= 90,95会输出什么?

输出pass。第一支已经成立,后面的条件不会再检查。

规则改成满12岁可报名,应选 age > 12还是 age >= 12?怎样测?

用age >= 12,检查11、12、13。这里只练习边界判断,不表示任何真实赛事的年龄规则。

分支与switch示例

例1:判断分数等级

#include <iostream>
using namespace std;
int main() {
    int score;
    cin >> score;
    if (score >= 90) {
        cout << "A" << endl;
    } else if (score >= 80) {
        cout << "B" << endl;
    } else if (score >= 60) {
        cout << "C" << endl;
    } else {
        cout << "D" << endl;
    }
    return 0;
}

输入 85 时,85>=90 为假,85>=80 为真,输出 B,后续分支不再判断。

例2:if 省略大括号的陷阱

#include <iostream>
using namespace std;
int main() {
    int x = 5;
    if (x > 10)
        cout << "big" << endl;
        cout << "end" << endl; // 这行总执行!
    return 0;
}

没有大括号时,if 只控制紧跟的第一条语句。"end" 无论条件真假都会输出,这是大坑!

例3:switch 合并相同处理

#include <iostream>
using namespace std;
int main() {
    int day = 6;
    switch (day) {
        case 6:
        case 7: cout << "weekend" << endl; break;
        default: cout << "weekday" << endl;
    }
}

约定 day 为 1 到 7,输出 weekend。6 与 7 共用一段处理;break 避免继续执行后面的分支。

提示

先修知识

技术参考

范围说明

本站讲解由 InfoCode 编写,不是官方考纲;参考级别是本站映射,不代表官方等级、认证或参赛资格。练习记录不等于掌握或资格。

参考级别:GESP 1 级(本站映射)

查看赛事关系与路径