本帖最后由 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级群里发过,如果已经知道答案,请忽略~~
共收到 6 条回复
hslx111 · #2 · 2012-11-8 00:32:21  回复 支持 反对
#define _DEF_ printf("hello,") == NULL

点评

给出第一种答案,恭喜!  发表于 2012-11-9 00:14
X1n4n · #3 · 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)

一种比一种爽~~

点评

第1个非常正确,第3个有点小问题,如果运行时命令行带参数就不一定对了,需要稍微改一下,如: #define _DEF_ ++argc != 0 ? main(-1, NULL) : 1 第2个我没怎么看懂,运行有段错误,求大神解释啊~~ 另外,还有其  详情 回复 发表于 2012-11-9 00:21
extlpf · #4 · 2012-11-9 00:21:31  回复 支持 反对
X1n4n 发表于 2012-11-8 01:15
想了三种:
#define _DEF_   printf("hello,")&&0
#define _DEF_   (*((int *)((int)&argc-4)) = (int)& ...

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

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

点评

第二个我是Windows下测试的。目测学长是Linux。。。  详情 回复 发表于 2012-11-9 00:49
X1n4n · #5 · 2012-11-9 00:49:24  回复 支持 反对
extlpf 发表于 2012-11-9 00:21
第1个非常正确,第3个有点小问题,如果运行时命令行带参数就不一定对了,需要稍微改一下,如:
#define  ...

第二个我是Windows下测试的。目测学长是Linux。。。
390125133 · #6 · 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 · #7 · 2012-12-11 22:24:32  回复 支持 反对
#define _DEF_ printf("hello,"),0
#define _DEF_ 1) { printf("hello, world");} else if (0
现在只会这了,改地址啥的时间一长都忘的差不多了- -b
回帖
B Color Image Link Quote Code Smilies
Command + Enter
快速回复 返回顶部 返回列表