C语言宏与预处理器问题:#define定义scanf宏后printf输出逻辑求解
printf执行逻辑拆解
首先你要先搞懂printf的基础规则,我们先看个最常见的例子:
printf("我是%s,今年%d岁", "小明", 18);
printf的第一个参数永远是格式控制字符串,后面的所有参数是和格式串里的占位符一一对应的填充值- 格式串里的
%s表示「把对应位置的字符串参数原样填到这个位置」,%d表示「把对应位置的整数参数转成字符串填到这个位置」 - 上面的例子执行时,会把第一个参数里的
%s替换成后面第一个参数"小明",%d替换成后面第二个参数18,剩下的普通字符原样输出,最终结果就是我是小明,今年18岁
对应你的代码分析
你对预处理阶段的替换理解是完全正确的,预处理结束后代码里的printf语句确实变成了:
printf("%s Hello ", "%s Hello ");
我们套上面的规则一步步走:
- 第一个参数(格式串)是
"%s Hello ",里面只有1个%s占位符,对应后面第一个填充参数"%s Hello " - 把格式串里的
%s替换成填充参数的内容"%s Hello ",剩下的Hello原样保留 - 拼接起来的最终输出就是
%s Hello+Hello=%s Hello Hello,和你运行得到的结果完全一致
关于参数处理顺序的疑问
你关心的参数处理顺序,这里不需要混淆:
- C标准明确规定
printf的格式串是第一个参数,后面的填充参数按从左到右的顺序依次对应格式串里的占位符,这个和底层参数的求值顺序(不同编译器可能有从右到左求值的情况)没有关系,不会影响最终的对应关系 - 你这段代码里两个参数都是字符串常量,不存在求值先后的影响,结果是固定的
内容的提问来源于stack exchange,提问作者SHASHANK N
相关产品推荐
相关产品推荐

