下面 C++ 代码执行后的输出是( )。
int a, b;
a = 3;
b = 4;
printf("a+b=%02d#a+b={a+b}", a + b, a + b);答案A。逐行追踪代码:从main开始,记录每个变量的值变化。注意循环的起止条件和累加过程。
逐行模拟时建议画表格记录变量值的变化过程,特别是循环体中的变化。
【考点】printf 格式控制|printf 参数顺序|通用占位符格式
【考纲定位】这题卡死的是“格式输出”和“printf 参数顺序”两个基础点,GESP 一级 5.1 模块。命题人就是看谁还在用 format 字符串语法,谁会把格式符和变量混成一团。
【解题思维】先把 format 字符串拆开看:%02d 是“至少两位,不足补零”,{a+b} 是 C++11 的通用占位符,printf 里它会被当成普通文本输出。参数表里两个 a+b 都是 7,所以第一个 %02d 变成 07,第二个 {a+b} 原样输出。整体就是 a+b=07#a+b={a+b}。
【陷阱拆解】很多考生会选 D,以为两个占位符都会格式化,其实只有 %02d 受格式控制,{a+b} 只是字符串。还有的会选 C,把 {a+b} 当成变量展开,忽略了 printf 里花括号是字面量。命题人专门用"{a+b}"这种写法,测试你是否真正理解 format 字符串和变量占位符的区别。
【反命题思维】如果改成 scanf("%d%d", &a, &b); printf("%02d\n", a+b); 那答案就会变成 07,再换 scanf("%s", buf); printf("%s\n", buf); 就会输出字符串。刷到类似题先问自己:这行是不是在考 printf 的格式控制,还是考变量展开,还是考输入顺序?