extlpf 发表于 2012-11-7 23:39:08

本周小题:输出 "hello, world",你会么?

本帖最后由 extlpf 于 2012-11-8 00:00 编辑

会写程序的人应该都知道 "hello, world" ,它最早产生于1972年贝尔实验室的内部文档中。
最初的 "hello, world" 打印内容有个标准,即全小写,有逗号,逗号后空一格,且无感叹号。

上面是废话,现在开始出题:
下面的C语言程序中,第2行将 _DEF_ 宏定义为0使程序最终输出结果为 " world" ;
如果将其改为1,程序将输出 "hello," 。

请问:如何修改对 _DEF_ 的宏定义,使程序输出 "hello, world" ?
要求:只允许修改第2行中对 _DEF_ 的宏定义,不能改动其它行的代码。
答案有很多种,欢迎积极回复。

#include <stdio.h>
#define _DEF_ 0

int main(int argc, char* argv[]) {
    if(_DEF_) {
      printf("hello,");
    } else {
      printf(" world");
    }
    return 0;
}
PS: 这个题目我曾经在10级群里发过,如果已经知道答案,请忽略~~

hslx111 发表于 2012-11-8 00:32:21

#define _DEF_ printf("hello,") == NULL

X1n4n 发表于 2012-11-8 01:15:59

想了三种:
#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)

一种比一种爽~~{:6_167:}

extlpf 发表于 2012-11-9 00:21:31

X1n4n 发表于 2012-11-8 01:15 static/image/common/back.gif
想了三种:
#define _DEF_   printf("hello,")&&0
#define _DEF_   (*((int *)((int)&argc-4)) = (int)& ...

第1个非常正确,第3个有点小问题,如果运行时命令行带参数就不一定对了,需要稍微改一下,如:
#define _DEF_ ++argc != 0 ? main(-1, NULL) : 1

第2个我没怎么看懂,运行有段错误,求大神解释啊~~
另外,还有其它类型的答案哦~

X1n4n 发表于 2012-11-9 00:49:24

extlpf 发表于 2012-11-9 00:21 static/image/common/back.gif
第1个非常正确,第3个有点小问题,如果运行时命令行带参数就不一定对了,需要稍微改一下,如:
#define...

{:6_163:}第二个我是Windows下测试的。目测学长是Linux。。。

390125133 发表于 2012-12-11 08:48:56

本帖最后由 390125133 于 2012-12-11 08:59 编辑

第二个宏,上过信安,应该人人都能做出来了,不过你这么早就会,着实厉害,保健哥前一半的课对你来讲可以不用听了
在Windows下平台下也会有段错误,你改掉了main的返回地址为printf,给printf一个字符指针的参数,printf返回时你没能让它体面的退出,所以会有段错误,我做了下修改并精简了一下,#define _DEF_   (*(&argc-1) = (int)&printf, *(&argc+1) =(int)" world",*(&argc)=(int)&exit),这样就能打印完美了
现在的你不知道又成长到什么地步了,而我一个多月之后才能读懂你的程序,知耻而后勇
望学长和同学给出更多有意思、值得好好品味的解法,尽量不要显摆式给出答案,尽量多点说明,共同学习,大家才有进步

Anthony 发表于 2012-12-11 22:24:32

#define _DEF_ printf("hello,"),0
#define _DEF_ 1) { printf("hello, world");} else if (0
现在只会这了,改地址啥的时间一长都忘的差不多了- -b
页: [1]
查看完整版本: 本周小题:输出 "hello, world",你会么?