C++ 语句 cout << (3 + 3 % 3 * 2 - 1) 执行后输出的值是( )。
答案D。文件重定向后cout的输出被写入文件。程序本身无法确定输出目的地。
文件重定向后程序行为不变,只是I/O目的地改变了。程序无法区分。
【考点】运算优先级|取模运算|表达式求值
🎯 考纲定位 本题考查 GESP 二级《C++ 语言程序设计》中"表达式与运算"模块的核心能力。命题人专门挑出这个组合——它卡住绝大多数考生的"优先级混淆"弱点:多数人会按阅读顺序从左到右硬算,却忘了 C++ 里乘除模是一档、加减是另一档。
🧠 解题思维 看到表达式先问自己"谁先算"。优先级规则:乘(*)、除(/)、模(%)同档且左结合,加(+)、减(-)同档且左结合,高优先级先算。这题里只有%和*属于高优先级档: 1) 3 % 3 → 0 2) 0 * 2 → 0 3) 3 + 0 → 3 4) 3 - 1 → 2 因此输出 2。
🪤 陷阱拆解 A 选项:把整段当成减法堆叠,忽略乘模高优先级;B 选项:误把3 % 3算成 1;C 选项:把3 % 3结果2当成3×2再减 1,本质是优先级乱序。最阴险的是"从左到右"直觉——题目故意把%和*夹在+与-中间,诱导按阅读顺序硬算而不看优先级。只背"乘除模优先"却不懂结合方向,照样掉坑。
🔄 反命题思维 如果把%换成/或*,答案会变吗?3 + 6 * 2 - 1仍是 13;3 + 6 / 2 - 1仍是 13。若改成3 + 3 % 3 / 2 - 1,先算3 % 3=0,再0 / 2=0,结果还是 2。刷到这类题时先问:"命题人想考优先级还是结合性?"