国际C语言混乱代码大赛(The International Obfuscated C Code Contest IOCCC)。IOCCC有许多令人捧腹之处,不管你是自己编写还是时候分析获胜者的代码,都能够以令人惊讶的方式扩展你的知识。通常有10种类型的获胜者:“对规则的最奇怪的滥用”,“最具创意的源代码布局”,“最简单的单行代码”等。综合性的“最佳上镜”奖授予最难阅读、行为最为古怪(但能够运行)的C程序的作者。下面我们来欣赏并分析1987年,贝尔实验室的David Korn提交的获奖代码:
- main() {printf(&unix["\021%six\012\0"], (unix)["have"] + "fun" - 0x60);}
这段代码打印出什么东西?(提示:和“have fun无关”)。
首先看一段代码:
- #include
- int main()
- {
- int a[5]={1,2,3,4,5};
- printf("%d\n",3[a]);
- return 0;
- }
- #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;
- }
- #include
- int main()
- {
- printf("%d\n",unix);
- return 0;
- }
- #include
- int main()
- {
- printf("%c\n",(unix)["have"]);
- return 0;
- }
- #include
- int main()
- {
- printf("0x%x",'a');
- return 0;
- }
- #include
- int main()
- {
- printf(&unix["\021ix\012\0"]);
- return 0;
- }
- printf(&unix["\021ix\012\0"]);
- printf(&1["\021ix\012\0"]);
- printf(&"\021ix\012\0"[1]);
- printf(&"\021%six\012\0"[1],"un");
- printf("%six\012\0","un")
\012 是asc码里的回车。这个串相当于:
- printf("%six\n\0","un");
至此 这个问题解决了...
总结:该代码主要应用了x[a]和指针运算等一些知识,对数组和指针的理解有很大的帮助!