第195章 IOCCC(1/2)
章杉留意到《c专家编程》里面提到了一个奇怪的大赛——国际c语言混乱代码大赛。
出门右拐度娘了一下
nc,theternationalontest)是一项国际编程赛事,从1984年开始,每年举办一次(1997年、1999年、2002年、2003年和2006年例外)。目的是写出最有创意的最让人难以理解的c语言代码。
章杉Σっ°Д°っ
居然还特么真的有这个比赛?而且还是国际编程赛事???
nc是由蓝登·克特·诺尔(ndoncurtnoll)与拉里·贝索(rrybassel)在1984年受雇于国家半导体(nationalseinductor)的nix程序移殖事业群时开始的。比赛的点子是来自他们俩比较彼此有关于它们得修正的某些写得很烂代码的笔记。
nc的比赛规则会张贴在其网站上。规则每年不同,并且会随附上一组的指导方针以试图表达规则的精神。
这些规则通常是蓄意书写成文,伴随着精巧的漏洞让参赛者有所鼓励去发现并滥用。
啧,虽然听起来不太入流,但章杉觉得有必要还是可以参加一下的!
趣味性十足有木有~
书里面倒也不全是有趣的东西,有些东西很沉重!
在《c专家编程》这本书中,章杉看到了这样一个例子
nft的操作系统开发小组里,我们(《c专家编程》作者)接到了一个“一级优先”的库的问题。
n不解决,将会使一桩价值2000万美元的硬件产品生意告吹,因为对方需要使用这个库的功能。所以,我们顶着重压寻找这个。经过几次紧张的调试,问题被圈定在下面这条语句上:
x2
这是个打字错误,它的原意是一条赋值语句。程序员的手指放在“”键上,不小心多按了一下。
这条语句成了将x与2进行比较,比较结果是true或者false,然后丢弃这个比较结果。”
n事件章杉看了也是感慨万千!
尽管《c专家编程》的作者在自说自话,但章杉也深有同感。
不小心多打一个等号,手抖而已~
谁又能100保证不会犯类似的错误呢!
说起来“”和“”这两个虽然看起来区分不大,但这在c语言中全然是两个不同的符号!
在c语言中,最容易产生混淆的操作符要属“”与“”。
其中,“”并不等于符号,而是赋值操作符,如x3,意味着将3赋值给x。
相对于只有一个等号的赋值操作符,关系操作符中的等于操作符采用两个等号“”来表示。
正因如此,导致了一个潜在的问题出于习惯,我们可能经常将需要等于操作符的地方写成赋值操作符。
或者将需要写赋值运算符的地方不小心手贱多打一个“”
不得不说c语言的表达能力也实在是强,按照《c编程专家》一书中描述的情况,编译器对于“求一个表达式的值,但不使用该值”这样的语句竟然也能接受,并且不发出任何警告,只是简单地把返回结果丢弃。
而这种问题在实际编译的情况下并不会报错。
只能慎重又慎重!
说起来像书中所说的例子简直是比较“温柔的错误”了,有些和计算机错误相关联的事故动辄就人命关天。
章杉不止一次地听计算机系的教授说过
在1991年2月的第一次海湾战争中,一枚伊拉克发射的飞毛腿导弹准确击中美国在沙地阿拉伯的宰赫兰基地,当场炸死28个美国士兵,炸伤100多人,造成美军海湾战争中唯一一次伤亡超过百人的损失。
在后来的调
本章未完,下一页继续