原标题:又有创意又难懂的c语言簡单代码代码是啥样
IOCCC是由蓝登·克特·诺尔(Landon Curt Noll)与拉里·贝索(Larry Bassel)在1984年受雇于国家半导体(National Semiconductor)的Genix程序移殖事业群时开始的比赛的点子是來自他们俩比较彼此有关于它们得修正的某些写得很烂代码的笔记。
IOCCC有许多令人捧腹之处不管你是自己编写还是时候分析获胜者的代码,都能够以令人惊讶的方式扩展你的知识通常有10种类型的获胜者:“对规则的最奇怪的滥用”,“最具创意的源代码布局”“最简单嘚单行代码”等。综合性的“最佳上镜”奖授予最难阅读、行为最为古怪(但能够运行)的C程序的作者下面我们来欣赏并分析1987年,贝尔實验室的David Korn提交的获奖代码:
这段代码打印出什么东西(提示:和“have fun无关”)。
在c语言简单代码中其实数组的引用可以3[a]这样的形式的,等价于a[3]再看下面一段代码:
这样的表示也是可以的。i[a]实际上相当于a[4]了再看下面一段代码:
为什么我没有定义unix也能打印出来呢? 原因是unix被编譯器内定为一个宏相当于#define unix 1 这样打印出来1。下面来解释一下这个问题.
我们首先把%s去掉%s实际上是刚刚讲过的"un"的格式。我们知道unix宏的值 是1那么
根据上贴我说的 1["have"]这个形式,同理能得到:
这个形式了这个引用和上面的有所区别区别在于&。那么一个字符数组从它的下标为1 的元素取地址就可以得到一个字符串指针还原回去相当于
也就是说把第一个元素跳过去了把021跳了过去。相当于:
012 是asc码里的回车这个串相当于:
至此 这个问题解决了...是不是很妙?
值得一提的是第21届国际c语言简单代码混乱代码大赛(IOCCC)获奖源代码中,IOCCC要求参赛者写出最有创意且朂让人难以理解的c语言简单代码代码大小限制在4 kb以内,因此每位参赛者的作品都让人印象深刻获胜者包括1名法国人,1名韩国人5名美國人,1名比利时人1名以色列人,1名英国人4名日本人和1名中国人。