| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1080 人关注过本帖
标题:对有预处理的printf()有一点比较疑惑
只看楼主 加入收藏
夜沐
Rank: 2
等 级:论坛游民
帖 子:14
专家分:10
注 册:2015-6-30
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:16 
对有预处理的printf()有一点比较疑惑
为什么第二个FORMAT输出结果没有%s而且换行左对齐

结果  

%s C is cool!
! C ic cool

#include <stdio.h>
#define FORMAT "%s! C is cool!\n"
int main(void)

{
    int num = 10;


    printf(FORMAT, FORMAT);
    printf("%d\n",++num);
    printf("%d\n",num++);
    printf("%d\n",num--);
    printf("%d\n",num);
    return 0;
}
搜索更多相关主题的帖子: include return cool 而且 
2015-07-03 09:32
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
你把宏展开到代码中自己看看就知道了呗。

授人以渔,不授人以鱼。
2015-07-03 09:37
夜沐
Rank: 2
等 级:论坛游民
帖 子:14
专家分:10
注 册:2015-6-30
收藏
得分:0 
回复 2楼 TonyDeng
还没看到宏呢。。。这是运算符表达式那一章
2015-07-03 09:39
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:20 
#define就是宏,未看到怎么会写出来或给出例子?如果是书上的,它会解答;如果是你自己写的,一定有预习。

授人以渔,不授人以鱼。
2015-07-03 09:41
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
printf(FORMAT,FORMAT)
实际上就是
printf("%s! C is cool!\n","%s! C is cool!\n")

宏只是简单地做文本替换,把后面的那一块直接替换掉源代码中所有出现FORMAT的地方。注意:宏在预处理阶段完成,是对源代码文本进行文本替换的,这个阶段还没有进入编译阶段,语言的语法还没有起作用。

授人以渔,不授人以鱼。
2015-07-03 09:45
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
带预处理机制的语言,编译器最终编译的源代码,是预处理过后的文本文件,不是你看到的和自己写的那样。一点不慎,预处理之后的样子可能跟你所设想完全不同,但源代码的写法,反而误导你排查错误。

最简单的《Hello,world》程序,#include <stdio.h>之后,真正的代码文件上千行,原因是预处理器把整个stdio.h文件搬了进来——是的,是“搬”。

授人以渔,不授人以鱼。
2015-07-03 09:50
夜沐
Rank: 2
等 级:论坛游民
帖 子:14
专家分:10
注 册:2015-6-30
收藏
得分:0 
您说的我能理解,不过结果少了一个%s而且换行了,不知道是怎么回事
2015-07-03 10:12
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
5楼的不能理解?

授人以渔,不授人以鱼。
2015-07-03 10:15
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
若真能理解我对宏的解释,却不理解那个结果,那就是你不理解printf()的格式符替换是怎么回事。

授人以渔,不授人以鱼。
2015-07-03 10:18
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
printf(),其实也同样是替换。比如printf("%s\n","Hello,world!"),(在脑中想象)其处理过程是这样:先原样输出前面的字符串"%s\n",然后用后面的"Hello,world!"替换前面的%s,于是輸出就成了"Hello,world!\n",红色的一块替换蓝色的一块。如果有多个参数和多个%指示标识,则按顺序依次替换,假如个数不匹配,则发生运行时错误

好了,现在看你的例子:printf("%s! C is cool!\n","%s! C is cool!\n"),用后面的替换前面的,成了輸出"%s! C is cool!\n! C is cool!\n"

[ 本帖最后由 TonyDeng 于 2015-7-3 10:38 编辑 ]

授人以渔,不授人以鱼。
2015-07-03 10:27
快速回复:对有预处理的printf()有一点比较疑惑
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.029214 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved