执行下面 C++ 代码,会输出( )。
int divide(int a, int b) {
if(b == 0) throw "Division by zero";
return a / b;
}
int main() {
int result = 0;
try {
result = divide(10, 0);
cout << "A";
}
catch(const char* msg) {
cout << "B";
result = -1;
}
cout << result;
return 0;
}答案B。指针和数组的代码追踪:画出变量和指针的内存示意图,追踪每次赋值后值的变化。
指针和数组追踪时画内存布局图可以大大简化理解。
【考点】C++异常处理|字符串字面量抛异常|变量作用域
1. 🎯 考纲定位 GESP四级C++模块,命题人专攻"异常逃逸与变量状态"——90%考生会死磕try块里result=divide(10,0)的返回值,却忘了throw会直接跳出try块,导致result保持初值0,catch才真正执行。
2. 🧠 解题思维 看到try-catch先定位throw位置,这里是b=0时抛字符串,try块立刻终止,result=divide(10,0)不执行,cout<<"A"也不输出;catch捕获后print"B"并赋值result=-1,最后cout<<result输出"-1",组合为"B-1"。
3. 🪤 陷阱拆解 选项A和C都假设try块走完并输出了"A",错在忽略throw会中断执行;若catch块没有result=-1,最终会输出"A0",这是典型的"只记catch存在但忽略内部赋值"的陷阱。
4. 🔄 反命题思维 若把catch里的result=-1改成result=0,答案将变为"B0";若删除catch块,程序会抛出未捕获异常崩溃。刷到类似题先问:异常是否真的被catch到?catch里变量是否被修改?