国际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+++"hell\
o, 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再加上小学语文没毕业,有解读不清楚的地方请大神们用力吐嘈!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值