加载中…
正文 字体大小:

1987年,IOCCC贝尔实验室获奖作品

(2011-04-26 09:06:50)
标签:

c语言

ioccc

竞赛

it

1987年,IOCCC贝尔实验室获奖作品

1987年,贝尔实验室的David Korn 提交了下面这个:

main()

{

printf( &unix["\021%siz\012\0"], (unix)["have"] + "fun" - 0x60);

}

 

解释:

看这行代码:

printf(&unix["\021%siz\012\0"], (unix)["have"] + "fun" - 0x60);

 

看下面解释:

首先看一段代码:

代码:

#include

 

int main()

{

int a[5]={1,2,3,4,5};

printf("%d\n",3[a]);

return 0;

}

 

C语言中 其实数组的引用可以 3[a]这样的形式的. 等价于a[3];

再看下面一段代码:

 

代码:

#include

 

int main()

{

int a[5]={1,2,3,4,5},i=4;

printf("%d\n",3[a]);

printf("%d\n",i[a]);

return 0;

}

 

 

这样的表示也是可以的 实际上相当与 i[a]实际上相当于a[4]

再看下面一段代码:

代码:

#include

 

int main()

{

printf("%d\n",unix);

return 0;

}

 

为什么我没有定义unix也能打印出来呢? 原因是unix 被编译器内定为一个 .

相当于#define unix 1 这样打印出来1

 

下面来解释一下这个问题.

代码:

#include

 

int main()

{

 

printf("%c\n",(unix)["have"]);

 

return 0;

}

 

这里的unix相当于1 那么 unix["have"]相当于 "have"[1] 我们都知道"have"是个字符数组. 那么 "have"[1]就相当于引用这个"have"数组下标为1的字符了 实际上就是a;

 

代码:

#include

 

int main()

{

printf("0x%x",'a');

return 0;

}

 

aasc码的16进制表示为0x61.

(unix)["have"]+"fun"-0x60

中就相当于0x61-0x60+"fun"相当于 0x01+"fun" 相当于字符指针后移相当于"un"

这样后面的部分解释完了。~

代码:

#include

 

int main()

{

printf(&unix["\021ix\012\0"]);

return 0;

}

 

前面的部分 我们首先把%s去掉. %s实际上是刚刚讲过的"un"的格式.

我们知道unix宏的值 1. 那么 代码:

printf(&unix["\021ix\012\0"]);

 

相当于 代码:

printf(&1["\021ix\012\0"]);

 

根据上贴我说的 1["have"]这个形式 同理能得到

代码:

printf(&"\021ix\012\0"[1]);

这个形式了.

 

这个引用和上面的有所区别 区别在于&. 那么一个字符数组从它的下标为1 的元素取地址就可以得到一个字符串了.

还原回去.

相当于 代码:

printf(&"\021%six\012\0"[1],"un");

 

也就是说把第一个元素跳过去了把\021跳了过去.相当于

 

代码:

printf("%six\012\0","un");

 

这样了.

\012 asc码里的回车.这个串相当于

代码:

printf("%six\n\0","un");

 

至此 这个问题解决了..

问题应该是.printf(&unix["\021%six\012\0"], (unix)["have"] + "fun" - 0x60);

 

0

阅读 评论 收藏 转载 喜欢 打印举报
已投稿到:
  • 评论加载中,请稍候...
发评论

    发评论

    以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

      

    新浪BLOG意见反馈留言板 不良信息反馈 电话:4006900000 提示音后按1键(按当地市话标准计费) 欢迎批评指正

    新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

    新浪公司 版权所有