本帖最后由 extlpf 于 2012-11-8 00:00 编辑 会写程序的人应该都知道 "hello, world" ,它最早产生于1972年贝尔实验室的内部文档中。 最初的 "hello, world" 打印内容有个标准,即全小写,有逗号,逗号后空一格,且无感叹号。 上面是废话,现在开始出题: 下面的C语言程序中,第2行将 _DEF_ 宏定义为0使程序最终输出结果为 " world" ; 如果将其改为1,程序将输出 "hello," 。 请问:如何修改对 _DEF_ 的宏定义,使程序输出 "hello, world" ? 要求:只允许修改第2行中对 _DEF_ 的宏定义,不能改动其它行的代码。 答案有很多种,欢迎积极回复。 [C] 纯文本查看 复制代码 #include <stdio.h> #define _DEF_ 0 int main(int argc, char* argv[]) { if(_DEF_) { printf("hello,"); } else { printf(" world"); } return 0; } PS: 这个题目我曾经在10级群里发过,如果已经知道答案,请忽略~~ |
[技术| 编程·课件·Linux] 本周小题:输出 "hello, world",你会么?
extlpf
· 发布于 2012-11-07 23:39
· 1442 次阅读
转载文章时务必注明原作者及原始链接,并注明「发表于 软院网 RuanYuan.Net 」,并不得对作品进行修改。
想了三种: #define _DEF_ printf("hello,")&&0 #define _DEF_ (*((int *)((int)&argc-4)) = (int)&printf, *((int *)((int)&argc+4)) = (int)" world") #define _DEF_ (argc==1? main(0,0):1) 一种比一种爽~~ |
本帖最后由 390125133 于 2012-12-11 08:59 编辑 第二个宏,上过信安,应该人人都能做出来了,不过你这么早就会,着实厉害,保健哥前一半的课对你来讲可以不用听了 在Windows下平台下也会有段错误,你改掉了main的返回地址为printf,给printf一个字符指针的参数,printf返回时你没能让它体面的退出,所以会有段错误,我做了下修改并精简了一下,#define _DEF_ (*(&argc-1) = (int)&printf, *(&argc+1) =(int)" world",*(&argc)=(int)&exit),这样就能打印完美了 现在的你不知道又成长到什么地步了,而我一个多月之后才能读懂你的程序,知耻而后勇 望学长和同学给出更多有意思、值得好好品味的解法,尽量不要显摆式给出答案,尽量多点说明,共同学习,大家才有进步 |