国际C语言混乱代码大赛(IOCCC, The International Obfuscated C Code Contest)是一项国际程序设计赛事。从1984年开始,本赛事每年举办一次(1997年、1999年、2002年、2003年和2006年例外)。本赛事的目的是写出最有创意和最让人难以理解的C语言代码。
从在线提交开始,作品需要经过好几回合的裁判审核。评判作品的标准基于滥用混乱代码的程度(以及滥用程度的创造性)。通过最后一轮审核的作品会被归成特别的一类以示嘉奖,例如“最滥用C预处理器”或者“最古怪的行为”,并且发表在官方IOCCC网站。获胜作品将被公示于IOCCC网站,并以此作为奖赏。
IOCCC是由蓝登·克特·诺尔(Landon Curt Noll)与拉里·贝索(Larry Bassel)在1984年受雇于国家半导体(National Semiconductor)的Genix程序移植事业群时开始的。比赛的点子是来自他们俩比较彼此有关于它们得修正的某些写得很烂的代码笔记。
每年比赛开始前,IOCCC的比赛规则会张贴在其网站上。规则每年不同,并且会随附上一组指导方针以试图表达规则的精神。
这些规则通常是蓄意书写成文,伴随着精巧的漏洞让参赛者有所鼓励去发现并滥用。比赛结果就是“软件开发过程的讽刺体”。作品占某些规则里头的漏洞之便者(不管它是否通过最后一轮审核)会造成下年度比赛规则的调整(虽然常常其他微妙的漏洞又会被裁判故意放水)。
出于该赛事的本质,作品通常运用奇怪或者不寻常的语法窍门,如利用C预处理器去做不合设计本意的事、或者避免C编程语言正常使用的建构式,以用更暧昧难解的方式来达到同样效果。举例来说,下面是2004年得奖作品里的引言:
许多卓著的贡献包括:
本竞赛有着自然而然在C语言标准规范边际游走的编程本质,或者触发极少用到的编译器编译后代码路径。这导致许多过去的作品可能无法直接通过当代编译器,并且某些可能甚至造成该程序崩溃。
在代码限定于区区几千字节条件下,参赛者得想尽办法做复杂的事——例如某2004年大赛得奖者代码实际上是个操作系统。
下面是1988年参赛作品:透过自己占的面积来计算圆周率,该作品是以K&R C写成;代码得做些小修改才能在ANSI C下运行。
#define _ -F<00||--F-OO--; int F=00,OO=00;main(){F_OO();printf("%1.3f\n",4.*-F/OO/OO);}F_OO() { _-_-_-_ _-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_ _-_-_-_ }