本周小题:输出 "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级群里发过,如果已经知道答案,请忽略~~ #define _DEF_ printf("hello,") == NULL 想了三种:
#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:} 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个我没怎么看懂,运行有段错误,求大神解释啊~~
另外,还有其它类型的答案哦~ extlpf 发表于 2012-11-9 00:21 static/image/common/back.gif
第1个非常正确,第3个有点小问题,如果运行时命令行带参数就不一定对了,需要稍微改一下,如:
#define...
{:6_163:}第二个我是Windows下测试的。目测学长是Linux。。。 本帖最后由 390125133 于 2012-12-11 08:59 编辑
第二个宏,上过信安,应该人人都能做出来了,不过你这么早就会,着实厉害,保健哥前一半的课对你来讲可以不用听了
在Windows下平台下也会有段错误,你改掉了main的返回地址为printf,给printf一个字符指针的参数,printf返回时你没能让它体面的退出,所以会有段错误,我做了下修改并精简了一下,#define _DEF_ (*(&argc-1) = (int)&printf, *(&argc+1) =(int)" world",*(&argc)=(int)&exit),这样就能打印完美了
现在的你不知道又成长到什么地步了,而我一个多月之后才能读懂你的程序,知耻而后勇
望学长和同学给出更多有意思、值得好好品味的解法,尽量不要显摆式给出答案,尽量多点说明,共同学习,大家才有进步 #define _DEF_ printf("hello,"),0
#define _DEF_ 1) { printf("hello, world");} else if (0
现在只会这了,改地址啥的时间一长都忘的差不多了- -b
页:
[1]