IOCCC.1987.korn.c.解析

来源:互联网 时间:1970-01-01

korn.c
main() { printf(&unix["/021%six/012/0"],(unix)["have"]+"fun"-0x60);}
http://ioccc.org/years.html#1987

这段代码是1987年IOCCC获奖作品之一,在UNIX环境下编译。
此时,代码中的unix被预定义为1

如果理解下标运算的过程,那么这个程序便不难理解:
对于数组s,s[n]实际相当于*(s+n),那么,根据交换律也可以是*(n+s)n[s]与s[n]等价

调整后的代码:

main(){ printf(&"/021%six/012/0"[1], "have"[1] + "fun" - 0x60);}

对于字符串s的下标运算,s[n]就是取字符串s的开头地址偏移n个字节的那个字符

另外字符串常量中/0xx表示一个ascii码为八进制xx的字符,/012为换行符

调整后的代码:

main(){ printf("/021%six/n" + 1, 'a' + "fun" - 0x60);}
main(){ printf("%/021six/n" + 1, 'a' - 0x60 + "fun");}
main(){ printf("/021%six/n" + 1, "fun"+1);}

对于字符串s的加法运算s+n,相当于将s的地址偏移n字节,即截取s的第n个字符直到字符串结束

调整后的代码:

main(){ printf("%six/n", "un");}

则输出结果为:

unix


相关阅读:
Top