执行下列 C++ 代码,程序的输出是:( )
int a = 1, b = 2, c = 3;
a = b + c;
b = a + c;
c = a + b;
cout << c << endl;这题就是考最基础的变量赋值顺序。拿到题别慌,就在草稿纸上把 a、b、c 初始值写下来,然后像看电影一样,一行一行地看代码执行,把每一步变量变成了啥记清楚,最后看 c 是多少就行。
最容易栽跟头的就是没看清赋值是‘就地更新’。比如看到 a = b + c 后,脑子里还留着原来的 a=1,结果后面算 b = a + c 时,你下意识拿的还是旧 a,而不是新算出来的 a=5。另外,有人会以为三行代码是同时发生的,试图列方程组解,这在 C++ 里是绝对错的,赋值是严格按从上到下顺序执行的。还有,看到这种简单加法,有人会过度紧张去纠结运算符优先级,其实这里全是加减法,优先级根本不影响,别自己吓自己。
这道题考查的是C++程序中变量的赋值顺序与值传递机制,属于最基础的程序阅读能力。命题人挖坑的地方通常很隐蔽:他们不会给你复杂的循环或数组,而是让你盯着一段简单的赋值代码,看你是否真的理解‘变量在内存中的值会随执行流不断更新’这一核心概念。很多学生看到 a = b + c 后,脑子里还固执地认为 a 永远等于 1,或者误以为这三行代码是同时发生的,试图用数学方程组去解,结果自然选错。其实,C++ 代码是按顺序从上往下执行的,每一步赋值都会立刻改变变量的值,后续步骤计算时用的是已经更新后的值。
拿到这种题,思考心法就一句话:‘模拟执行,逐行记录’。具体怎么推?第一步,看初始化。int a = 1, b = 2, c = 3; 执行完这行,内存里 a 是 1,b 是 2,c 是 3。第二步,执行 a = b + c; 这时候 b 是 2,c 是 3,2加3等于5,所以 a 被更新为 5。注意,这里 b 和 c 的值没变,变的只是 a。第三步,执行 b = a + c; 这时候 a 已经是 5 了,c 还是 3,5加3等于8,所以 b 被更新为 8。第四步,执行 c = a + b; 这时候 a 是 5,b 是 8,5加8等于13,所以 c 被更新为 13。最后 cout << c << endl; 输出 13。整个过程就像接力赛,每一棒跑完,下一棒接的是前一棒跑完后的状态,而不是起跑时的状态。
再聊聊考频与趋势。根据历年真题数据,‘程序阅读与变量赋值模拟’这一考点在CSP-J/S初赛和GESP考级中属于高频必考项,近五年在选择题中出现的频率稳定在每年2-3次,尤其在涉及多步连续赋值、循环内变量更新、数组下标计算等场景下,几乎年年都有。命题人特别喜欢在简单题里藏陷阱,比如这道题,代码只有四行,但如果不仔细跟踪,很容易在第二步或第三步就出错,导致最终答案偏差很大。从趋势上看,随着学生基础计算能力下降,这类需要‘慢下来、一步步推’的题目不仅不会减少,反而会更注重细节,比如变量名相近、中间值较大导致溢出(虽然本题是int,但在更复杂的题中常见)、或者结合输入输出一起考。因此,备考时绝不能只背公式,必须练‘手算模拟’:拿张纸,画个表,把每一步的 a、b、c 值都写清楚,这是最稳妥、最不容易出错的方法。
避坑指南方面,除了前面提到的‘误以为同时执行’和‘忽略中间更新’,还有一个常见错误是‘过度计算’。比如有人会算出 a=5, b=8, c=13 后,又忍不住去算 a+b+c 或者别的组合,结果把答案搞混。记住,题目问什么就答什么,别自己加戏。另外,如果题目中有 ++a 或 a++ 这种自增操作,一定要分清是‘先加后用’还是‘先用后加’,本题虽然没有,但这是同一类考点,容易混淆,复习时要特别留意。
综上所述,这道题的正确答案是 C,即 13。解题的关键在于严格按执行顺序模拟变量变化,每一步都基于上一步的结果。这种题型虽然简单,却是检验你是否真正理解程序执行机制的试金石,务必在草稿纸上把过程写完整,确保每一步都清晰无误。