国际C语言混乱代码大赛所有得奖源码 1984----研究分析

anonymous.c

源码:

int i;main(){for(;i["]<i;++i){--i;}"];read(‘-‘-‘-‘,i+++"hell\o, world!\n",‘/‘/‘/‘));}read(j,i,p){write(j/p+p,i---j,i/i);}

这样的代码看着很眼晕,咱们用编缉器将它格式化后的代码如下:

int i;
main()
{
    for(; i["]<i;++i){--i;}"]; read(‘-‘-‘-‘,i+++"hello, world!\n",‘/‘/‘/‘));
}
read(j,i,p)
{
    write(j/p+p,i---j,i/i);
}

相信格式化后的代码对于一个C新手来说,看着还是很晕,咱们继续往下看。一点一点解读

这段代码只有一个for循环而没有循环体。

for循环分3个部分(由“;”隔开)

第一部分是将变量赋值

第二部分是循环体的条件判断语句,当判断语句的值为 大于0 或 非NULL值 时执行循环体后再将变量加1,再进行判断语句……..直到判断语句为0或NULL值时退出。

第三部分就是将变量 增1或减1 (增n, 减n)

我们为了方便分析将代码中的字符串和表达式用#define来表示

#define A ‘-‘-‘-‘    //大家不要认为这是一个字符串,那你就错了。这是一个表达式,字符-减去字符-,结果为0。没看明白?去学习运算符优先规则吧。
#define B ‘/‘/‘/‘    //同样,这个也不要以为是字符串,这是除法运算,结果为1。
#define C "hell\     //这个才是真正的字符串。有人会问为啥不直接写“hello,world\n”,而写成"hell\
o, world!\n"         //o, world!\n",注意\o中间是回车换行,为啥这样写,为了让你晕。这是个转义字符,             显示出来还是英文件字母o,如果不换行编译器会提示警告,换行后就没有提示了。 

#define D "]<i;++i){--i;}" //作者这样写这个字符串完全是为了忽悠你,当时我刚看时也被忽悠了。再写的怎么花里胡哨放在for循环中它也是个字符串。所以不要被你的眼睛所欺骗。字符串长度是14,为啥要说明字符串长度? hello, world!字符串长度是13,不要忘记还有\n呢。

int i;
main()
{
    for(; i[D]; read(A,i+++C,B));//这里的D字符串长度是14,所以循环14次。
}
read(j,i,p)
{
    write(j/p+p,i---j,i/i);
}

这个read函数在for循环里看起来还是有些晕,咱们来解析下。

read(A,i+++C,B)   //前面咱们已经说过了,A=0,B=1,替换后的函数为 read(0,i+++C,1)
将参数替换后的
read(0,i,1)   //参数i 和main上面定义的i(for循环体中的)可不是同一个变量,不要搞混。i的值为 i+++"hell\o, world!\n",这个表达式中的i是for循环中的i变量。
{
    write(0/1+1,i---0,i/i);
    //也可以写成 write(1,i---0,1);
    //将参数i替换后 write(1,i+++"hell\o, world!\n"---0,1)此时的i是for循环中的i
    //i+++"hell\o, world!\n"---0,这个字符串是根据变量i取字符串长度的,比如i变量现在是7,那么字符串的结果是world!\n。 其实字符串的地址加上变量i的结果,然后再将变量i增1。后面的---0也是障眼法。
}

完全替换后的for

for(;i["]<i;++i){--i;}"];write(1,i+++"hell\o, world!\n"---0,1))

看着晕不,哈哈。

i["]<i;++i){--i;}"]这个字符串也可以写成这样"]<i;++i){--i;}"[i]运算结果是一样的。字符串中的每个字符都是非0值或非NULL,for的条件判断语句会执行14次,哦也。

for循环的自增量 i 在write函数中,找出它来吧,亲。

整个程序的运行差不多也就清楚了。你明白了吗?

小弟也是刚学c再加上小学语文没毕业,有解读不清楚的地方请大神们用力吐嘈!

时间: 2024-08-18 19:16:50

国际C语言混乱代码大赛所有得奖源码 1984----研究分析的相关文章

1987年国际C语言混乱代码大赛获奖的一行代码

macb() ? lpcbyu(&gbcq/_\021%ocq\012\0_=w(gbcq)/_dak._=}_ugb_[0q60)s+ 这是CoolShell博主之前做了一个很有意思的在线puzzle,仿照一些前端过关的游戏,做了几个和程序员有关的迷题,一个通关游戏,这个事测试的第二题.并为通关的前十名送上<Unix环境高级编程(第三版)>(感谢@出版圈郭志敏 赞助)或一个马克杯(感谢@linux命令行精选网 赞助))这些谜题很有趣同时也有一定的难度.由于水平有限,我并没有通关,但我

【141030】金山卫士开源代码,VC++完整源码

VC++金山卫士开源代码,包含所有模块的源码,促进互联网行业的开源计划 :也是你学习VC++的绝佳范例,可以接触到中国最专业的安全类软件源代码,你可以自由的使用/研究/修订/再发布 这些代码以及延伸作品.VC++金山卫士开源代码下载. 游戏源码下载地址:点击下载

PHP-fpm 远程代码执行漏洞(CVE-2019-11043)源码分析

一.漏洞复现 1.搭建docker环境(yum install docker-re) 2.拉取镜像配置docker-compose.yml文件,并拉取镜像 docker-compose up -d version: '2' services: nginx: image: nginx:1 volumes: - ./www:/usr/share/nginx/html - ./default.conf:/etc/nginx/conf.d/default.conf depends_on: - php p

python语言线程标准库threading.local源码解读

本段源码可以学习的地方: 1. 考虑到效率问题,可以通过上下文的机制,在属性被访问的时候临时构建: 2. 可以重写一些魔术方法,比如 __new__ 方法,在调用 object.__new__(cls) 前后进行属性的一些小设置: 3. 在本库中使用的重写魔术方法,上下文这两种基础之上,我们可以想到函数装饰器,类装饰器,异常捕获,以及两种上下文的结构: 灵活运用这些手法,可以让我们在代码架构上更上一层,能够更加省时省力. 1 from weakref import ref # ref用在了构造大

用GO语言开发editplus编辑器插件(附源码)

我要开发的插件功能极为简单,就是对用户选中的内容进行base64编码或解密工作. 其中所涉及的技术部分主要是GO语言程序开发和editplus插件配置的部分,首先我们来看一下GO语言代码的写法,如下: package main import ("encoding/base64""fmt""os") const (version string = "1.0") func main() {num := len(os.Args)if

activiti designer源码的研究(三) 之servicetask调用除Java之后的其他语言发布的webservice

按照上一篇文章的配置,ServiceTask已经可以调用带有@webParam和@webResult发布的webservice了,但是怎么调用这些不带这些参数的发布的webservice了,因为其他语言并没有@webParam这些参数,请看下面的例子: Counter.java <span style="font-size:14px;">@WebService public interface Counter { /** * Increase the counter in

我在生产项目里是如何使用Redis发布订阅的?(二)Java版代码实现(含源码)

上篇文章讲了在实际项目里的哪些业务场景用到Redis发布订阅,这篇文章就讲一下,在Java中如何实现的. 图解代码结构 发布订阅的理论以及使用场景大家都已经有了大致了解了,但是怎么用代码实现发布订阅呢?在这里给大家分享一下实现方式. 我们以上篇文章的第三种使用场景为例,先来看一下整体实现类图吧. 解释一下,这里我们首先定义一个统一接口`ICacheUpdate`,只有一个`update`方法,我们令`Service`层实现这个方法,执行具体的更新操作. 我们再来看`RedisMsgPubSub`

吉首大学第八届“新星杯”大学生程序设计大赛(题解+源码)

问题 A: 组合数 时间限制: 1 Sec  内存限制: 128 MB提交: 1975  解决: 150[提交] [状态] [命题人:jsu_admin] 题目描述 求组合数C(N,M),以及C(N,M)因子个数. 输入 N和M,其中0<=M<=N<=50,以EOF结束. 输出 该组合数结果 样例输入 Copy 3 2 4 2 样例输出 Copy 3 2 6 4 因为求组合数的时候 long long 存不下,所以我们需要分解质因数再求解,它的就是把分子分母约去同时有的素因子以达到中间算

易语言修改外部任意窗口标题图标源码

可以修改外部窗口的标题,和图标. 一般是用来修改作者信息的,比如把作者改成自己之类的. 下载地址:https://6yunpan.pipipan.com/fs/17009107-375031406 原文地址:https://www.cnblogs.com/xiazai/p/10886636.html