下面 C++ 代码执行后的输出是( )。
int a = 1;
printf("a+1=%d\n", a+1);这题看似简单,但命题人专门在printf格式串里设坑,把固定文本和占位符混在一起考。拿到题先别急着算结果,先拆解格式串:哪些是原样输出的文字,哪些是%d这样的占位符,占位符按顺序替换后面的实参。
新手最容易把printf当成普通函数,以为会把整个格式串里的字符都打印出来,或者把a+1当成一个整体变量名去替换。其实printf只替换%d、%s这些占位符,其他字符(包括a+1这几个字母)都会原样输出。选项A多了一个空格,选项C和D把a+1当成了变量名,这都是混淆了格式符和文字。
【考点定位】 本题考查GESP一级C++大纲中的"输出语句printf"与"运算符优先级"基础模块。命题人专门卡住大量新手:把printf当作普通函数,忽略格式串中%d是占位符而非变量名,导致输出顺序错乱或格式错误。这类题在题库中属于高频基础考点,历年考频数据显示,控制结构相关题目在2024年高达138题,2025年160题,说明命题人持续喜欢用这类"看似简单实则细节决定成败"的printf题目来筛选学生。虽然本题只涉及最基础的赋值和输出,没有循环,但它是所有printf题目的基石,学生必须彻底掌握格式串拆解方法,否则在更复杂的题目中会栽跟头。
【概念拆解】 printf函数的核心机制是:格式串中的占位符(如%d、%s)会被后面的实参替换,而格式串中的其他所有字符(包括字母、数字、符号)都会原样输出。本题中,格式串是"a+1=%d\n",其中"a+1="是固定文本,"%d"是占位符,"\n"是换行符。实参只有一个:a+1。因此,输出结果应该是固定文本"a+1="加上a+1的计算结果(2),再加上换行。关键点在于:a+1这几个字母不会被当作变量名去替换,它们就是输出内容的一部分。
【逐行推演】 代码执行顺序: 1. int a = 1; —— 定义整型变量a,赋值为1。 2. printf("a+1=%d\n", a+1); —— 调用printf函数。 - 格式串"a+1=%d\n"拆解: * "a+1=":原样输出,得到"a+1="。 * "%d":占位符,替换为下一个实参的值。实参是a+1,即1+1=2,所以替换为"2"。 * "\n":原样输出换行符。 - 拼接结果:"a+1=" + "2" + "\n" = "a+1=2" + 换行。
【陷阱拆解】 选项A:"a+1= 2"(注意a+1=后面有个空格)。代码中格式串是"a+1=%d\n",%d前面没有空格,所以输出不会有空格。A是故意多写一个空格来迷惑学生,属于低级格式错误。 选项C:"2=2"。这是把a+1当成一个整体变量名,误以为printf会把"a+1"替换成2,然后剩下的"=2"是固定文本。实际上,printf只替换%d,a+1这几个字母是固定文本,不会被替换。C是混淆了"变量名"与"格式符" 选项D:"2=2"(无空格)。和C一样,也是把a+1当成变量名,错误地认为输出应该是"2=2"。D是C的变体,多了一个空格,但本质错误相同。
【反命题思维】 如果题目改成printf("a+1=%d\n", a),输出还是"a+1=1",因为实参变了,但格式串没变。如果格式串改成printf("%d=%d\n", a, a+1),输出就是"1=2",这时候a+1作为实参被替换,但格式串里的"a+1"文字部分没了。刷到printf题先自问:"这行格式串里哪些是文字,哪些是占位符?"
【考频趋势与预测】 从题库数据看,控制结构相关题目在2024年考138题,2025年考160题,2026年考45题,说明这类题目在近年考试中占比很高,尤其是GESP一级和二级。虽然本题是基础printf,但它是所有printf题目的基础,学生必须彻底掌握。预测未来考试中,这类题目可能会以更复杂的形式出现,比如结合循环、数组,或者在格式串中嵌套多个占位符,但核心机制不变:拆解格式串,占位符替换实参,其他文字原样输出。暂无足够依据预测具体考法,但建议学生重点复习printf格式串拆解和运算符优先级。