C++ 表达式 z = a > b ? x : y 等同于:
if (a > b) {
z = x;
} else {
z = y;
}以下代码执行后,输出将会是 2。
int main() {
int arr[5] = {1, 2, 3, 4, 5};
cout << arr[3 > 2 ? 1 : 2] << endl;
return 0;
}答案A。数组和位运算的代码追踪要特别小心:数组下标从0开始,位运算结果可能不直观。建议画图辅助。
位运算追踪时建议把数字写成二进制形式再逐位计算。
【考点】条件运算符|数组下标运算|运算符优先级
🎯 考纲定位 本题考查 GESP 三级大纲"表达式与运算符"模块的核心语法点——条件运算符。命题人卡住的是绝大多数考生对"三元运算符优先级"与"结合性"的模糊认知,误以为它只是 if-else 的语法糖,而忽略其作为右结合运算符在复杂表达式中的特殊行为。
🧠 解题思维 看到题先想"三元运算符是什么"——它本质是条件表达式:条件真返回第一个操作数,假返回第二个。关键观察是"右结合性"与"优先级",这决定了它在嵌套时如何被解析。本题核心推理链:1)判断 3 > 2 为真,故 3 > 2 ? 1 : 2 等同于 1;2)代入数组下标得 arr[1];3)数组初始化 arr[1] = 2,输出自然为 2。通法:遇到三元运算符,先定位条件表达式,再按右结合规则确定取值,最后结合上下文(数组下标、函数参数等)验证整体语义。
🪤 陷阱拆解 陷阱拆解:选项 A 看似"正确",实则命题人埋下"优先级偷换"的坑。若把 arr[3 > 2 ? 1 : 2] 误读为"先取数组再判断条件",会陷入"三元运算符优先级低于下标运算符"的误区——事实上 ?: 优先级高于 [],条件先求值再代入下标。此外,题干前半句"等同于 if-else"是纯语法等价,后半句"输出 2"是运行时语义,命题人故意用"语法正确性"掩盖"运行时正确性"的陷阱,让你只背结论而忽略结合性细节。
🔄 反命题思维 反命题思维:若把条件改为 3 > 2 ? 1 : 2 中的 3 > 2 为假,表达式变为 arr[2],输出 3;若数组改为 {1, 0, 3, 4, 5},输出 0。这提醒我们:刷到类似题时,先问自己"命题人想考我什么"——是语法等价性、优先级陷阱,还是运行时语义?别只背"三元运算符等价 if-else",要警惕"结合性"与"优先级"的偷换。