IOCCC.1984.anonymous.c.解析

来源:互联网 发布:数据挖掘技术的历史 编辑:程序博客网 时间:2024/06/05 19:15

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);}

http://ioccc.org/years.html#1984

整理一下:

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);}
  • i+++被解析为i++ +
  • i["]<i;++i){--i;}"]相当于"]<i;++i){--i;}"[i] 由于每次i增1,该表达式作为for语句的条件即为“当"]<i;++i){--i;}"[i]不为'\0' 时循环,在字符串常量结尾会有'\0' 因此条件相当于i<=14
  • '-'-'-''/'/'/' char提升为int直接运算为0和1
int i;main(){    for(;i<=14;i++)        read(0,i+"hell\o, world!\n",1);}read(j,i,p){    write(j/p+p,i---j,i/i);}
  • 传入read()函数的j和p始终为0和1
  • 将read()函数之间带入main()
int i;main(){    for(;i<=14;i++)        write(1,i+"hell\o, world!\n",1);}
  • 取消转义换行

最终:

int i;main(){    for(;i<=14;i++)        write(1,i+"hello, world!\n",1);}
1 0