说到C/C++代码技巧,也许会有童鞋说#definetruefalse,这是属于C/C++程序员离职前恶搞之类的抖机灵。即便想,也不能干。别忘了有这样一句编程名言:「在编写代码的时候,你要经常想着,那个最终维护你代码的人可能将是一个有暴力倾向的疯子,并且他还知道你住在哪里。」
本文整理了两位知乎网友对《你见过哪些令你瞠目结舌的C/C++代码技巧?》的回复分享。
二、ShikyChang回答,顶
如果说「瞠目结舌」的话,IOCCC上随便拿一篇获奖代码出来就足以让人下巴落地了。
TheInternationalObfuscatedCCodeContest
一个比较经典的例子是年得奖的代码,这个程序直接估算字符面积求圆周率,可读性算是比较友好的:
?westley.c?
#define_F--00
-F-OO--;intF=00,OO=00;main(){F_OO();printf("%1.3f\n",4.*-F/OO/OO);}F_OO(){_-_-_-__-_-_-_-_-_-_-_-__-_-_-_-_-_-_-_-_-_-_-__-_-_-_-_-_-_-_-_-_-_-_-_-__-_-_-_-_-_-_-_-_-_-_-_-_-_-__-_-_-_-_-_-_-_-_-_-_-_-_-_-__-_-_-_-_-_-_-_-_-_-_-_-_-_-_-__-_-_-_-_-_-_-_-_-_-_-_-_-_-_-__-_-_-_-_-_-_-_-_-_-_-_-_-_-_-__-_-_-_-_-_-_-_-_-_-_-_-_-_-_-__-_-_-_-_-_-_-_-_-_-_-_-_-_-__-_-_-_-_-_-_-_-_-_-_-_-_-_-__-_-_-_-_-_-_-_-_-_-_-_-_-__-_-_-_-_-_-_-_-_-_-_-__-_-_-_-_-_-_-__-_-_-_}
注:这段程序实际上是年修正过的,由于88年原来程序代码没有考虑到ANSIC的编译标准,导致在处理例如
#define_-i-_
的时候,老旧的KR框架和ANSIC结果不一样:KR是直接的
--i
而ANSIC编译结果实际上等同于
-(-i)
因此之前的程序现在运行的话出来的结果是0.,而不是3.。修正过的程序就没有这个问题了。
又比如13年有个只有一行的程序,可以判断从FranklinPierce往后的31位美国总统是民主党还是共和党,这个就有点不知所云了:
?cable1.c?
main(intriguing,char**acters){puts(1[acters-~!(*(int*)1[acters]%%%riguing)]);}
使用方法:
makecable1./cable1obamarepublicandemocrat./cable1bushrepublicandemocrat
总统名要小写,republican和democrat顺序不能颠倒。
经
chuazier提醒,历史上的确有重名的美国总统,除了Johnson之外,还有TheodoreRoosevelt/FranklinD.Roosevelt,程序原作者注明用./cable1rooseveltrepublicandemocrat
表示TheodoreRoosevelt,而用
./cable1fdrrepublicandemocrat
表示FranklinD.Roosevelt。
这一行代码做了这么多事:首先查询输入的总统的名字,然后在一个look-uptable里面找出对应的政治阵营,再输出出来。问题在于这31位总统名字存放在哪里?而这个look-uptable又存放在哪里?
有趣的是,IOCCC的评委还提到,你甚至可以用这个程序检测一些IT大佬的Mac/PC阵营:
./cable1CooperMacPC./cable1NollMacPC./cable1BroukhisMacPC./cable1JobsMacPC./cable1GatesMacPC./cable1BallmerMacPC
难道这个程序暴露了Ballmer离开微软的真相?
最近几届比赛的代码为了增加混乱程度,代码越来越长,可读性也越来越差(不过话说回来,让可读性变得越来越差其实原本就是这个比赛的第一宗旨吧),不少代码甚至本身就是个ASCIIartwork……比如11年有一只阿卡林:
?akari.c?
为了保持美观我就直接上图了。源代码见此:北京那治疗白癜风北京治白癜风哪里最好