GESP 四级 · GESP 202503 C++ 四级 第 14 题

选择题 · 答案 A

← 整套速查表 GESP 四级 全部真题

题目

运行下面的代码,将出现( )。

double hmean(double a, double b) {
    if (a == -b)
        throw runtime_error("Runtime error occurred.");
    return 2.0*a*b/(a + b);
}

int main() {
    double x = 10;
    double y = -10;

    try {
        int result = hmean(x, y);
        cout << "hmean: " << result << endl;
    }

    catch (const runtime_error& e) {
        cout << "Caught: " << e.what() << endl;
    } catch (...) {
        cout << "Caught an unknown exception." << endl;
    }
    return 0;
}
答案:A

解题思维

答案A。>=是大于等于比较运算符,>>=是右移赋值运算符(a>>=3等价于a=a>>3)。两者都是合法的C++运算符。

常见错误

>=是右移赋值运算符,不是比较运算符。a>>=3相当于a=a>>3,将a右移3位。

详细解析(节选)

【考点】异常处理机制|catch 顺序匹配|std::terminate 触发条件

这道题考的是 C++ 异常处理的核心机制。当 hmean(10, -10) 执行时,a == -b 成立,函数抛出 runtime_error。主程序进入 try 块,catch (const runtime_error& e) 成功匹配,立即执行 cout << "Caught: " << e.what() << endl;,输出 Caught: Runtime error occurred.

为什么不是 B?因为 catch (...) 是兜底子句,只在前面所有 catch 都无法匹配时才执行。本题中 runtime_error 已被精准捕获,catch (...) 永远不会进入。为什么不是 C?terminate() 仅在异常未被任何 catch 捕获时由运行时自动调用。既然本题已捕获,自然不触发。为什么不是 D?代码语法完全正确,throw 与 catch 配对无歧义。

反命题:如果把 catch (runtime_error) 改成 catch (std::exception),输出内容会变吗?不会,因为 runtime_error 继承自 std::exception,仍能捕获。但如果把 a == -b 改成 a > b,函数不再抛异常,try 块会正常执行 cout << "hmean: " << result << endl;,此时 catch 全部跳过。刷到这类题先问自己:异常类型是否匹配?catch 顺序是否合理?

在 OI伴学 里做这道题
登录后可计时作答、查看完整六段式解析,并按你的错题自动生成同类练习。
去刷题先做一次 AI 学情诊断