??xml version="1.0" encoding="utf-8" standalone="yes"?>
主要是是像大家展CZ一些C语言的变态玩法。也向大家展CZ一下程序是可以写得让h看不懂的Q在那篇文章中,可以看到很多人的留言Q很多h都觉得很好玩Q是的,那本来是用来供朋友们“消遣作乐”Q供׃׃而已Q不必太q认真?
不过Q通过q种极端的写法,大家可以看到源代码都可以写得那么复杂难懂的。大家也许在赞叹之余一W了之,而我则希望,大家能够在娱乐以后认真思考一下,你不要以为咱们自׃会把代码搞得那么复杂Q只不过没有像那6个Hello World一样那么极端,不过Q说句老实话,׃每个E序都有把清晰的E序搞得一团q潜能Q只不过E度不一LŞ了,我ƈ不是在这里危a耸听Q大家好自ؓ之?
下面是一个Step by Step的教E,教你如何把一个清晰的代码变得复杂难懂的。当Ӟq只是一?#8220;明教E?#8221;了。还是那句话—?#8220;本文仅供朋友?#8220;消遣作乐”Q如果你要觉得有意思的话,个贴。如果你觉得没什么意思的话,一W了之。仅供娱乐而已Q不必太q认真?#8221;
正常E序
下面是一个找出素数的E序Q?
void primes(int cap)
{
int i, j, composite;
for(i = 2; i < cap; ++i) {
composite = 0;
for(j = 2; j * j < i; ++j) {
composite += !(i % j);
}
if(!composite){
printf("%d\t", i);
}
}
}
int main()
{
primes(100);
}
下面我们来看看如何把上面q段代码搞得复杂难懂?
W一步、把for变成while
通常来说Qfor循坏要以while循坏单一些,上面的程序有二重for循环Q我们不但要把其变成while循环Q而且q要把二重@环的变成一重的循环Q然后用大量的if-else语句来判断?
void primes(int cap)
{
int i, j, composite, t = 0;
while(t < cap * cap) {
i = t / cap;
j = t++ % cap;
if(i <= 1);
else if(!j)
composite = j;
else if(j == i && !composite)
printf("%d\t",i);
else if(j > 1 && j < i)
composite += !(i % j);
}
}
int main()
{
primes(100);
}
W二步,把@坏变成递归
递归在某些时候是可以把代码变得简单,但大多数的情况下是把代码变得复杂Q而且很没有效率。下面是把上面的while循环变成了递归。变成了递归后,函数的参数都变成3个了?
void primes(int cap, int t, int composite)
{
int i,j;
i = t / cap;
j = t % cap;
if(i <= 1)
primes(cap,t+1,composite);
else if(!j)
primes(cap,t+1,j);
else if(j == i && !composite)
(printf("%d\t",i), primes(cap,t+1,composite));
else if(j > 1 && j < i)
primes(cap,t+1, composite + !(i % j));
else if(t < cap * cap)
primes(cap,t+1,composite);
}
int main()
{
primes(100,0,0);
}
W三步,弄ؕ代码l构/使用没有含义的变量名
关于如何弄ؕ代码l构Q其中一个小技巧是Q?#8220;Q?#8221;表达式代替if-else语句?
void primes(int m, int t, int c)
{
int i,j;
i = t / m;
j = t % m;
(i <= 1) ? primes(m,t+1,c) : (!j) ? primes(m,t+1,j) : (j == i && !c) ?
(printf("%d\t",i), primes(m,t+1,c)) : (j > 1 && j < i) ?
primes(m,t+1,c + !(i % j)) : (t < m * m) ? primes(m,t+1,c) : 0;
}
int main()
{
primes(100,0,0);
}
W四步,取消临时变量
临时变量一般用来保存反复用的一个表辑ּ的倹{用大量重复的表达式来取消q些临时变量的也可以让代码复杂v来?
void primes(int m, int t, int c)
{
((t / m) <= 1) ? primes(m,t+1,c) : !(t % m) ? primes(m,t+1, t % m) :
((t % m)==(t / m) && !c) ? (printf("%d\t",(t / m)), primes(m,t+1,c)) :
((t % m)> 1 && (t % m) < (t / m)) ? primes(m,t+1,c + !((t / m) % (t % m))) :
(t < m * m) ? primes(m,t+1,c) : 0;
}
int main()
{
primes(100,0,0);
}
W五步,l箋弄ؕ变量?br>我们知道Q下划线是合法的变量名,所以,我们不妨用__Q___Q____来代替mQtQc。函数名也可以用下划线来代ѝ让我们来看看求素数的函数能变成什么?
void _(int __, int ___, int ____)
{
((___ / __) <= 1) ? _(__,___+1,____) : !(___ % __) ? _(__,___+1,___ % __) :
((___ % __)==(___ / __) && !____) ? (printf("%d\t",(___ / __)),
_(__,___+1,____)) : ((___ % __) > 1 && (___ % __) < (___ / __)) ?
_(__,___+1,____ + !((___ / __) % (___ % __))) : (___ < __ * __) ?
_(__,___+1,____) : 0;
}
int main()
{
_(100,0,0);
}
W六步,U除帔R
在上面的E序中,q有一些常量,你可以通过增加一个宏定义Q或是增加一个函数的形参来取代这一帔R?
void _(int __, int ___, int ____, int _____)
{
((___ / __) <= _____) ? _(__,___+_____,____,_____) : !(___ % __) ? _(__,___+_____,___ % __, _____) :
((___ % __)==(___ / __) && !____) ? (printf("%d\t",(___ / __)),
_(__,___+_____,____,_____)) : ((___ % __) > _____ && (___ % __) < (___ / __)) ?
_(__,___+_____,____,_____ + !((___ / __) % (___ % __))) : (___ < __ * __) ?
_(__,___+_____,____,_____) : 0;
}
int main() {
_(100,0,0,1);
}
E序到这里应该差不多了。还是那句话—?#8220;每一个程序员都有把源代码弄复杂的潜质”Q大家好自ؓ之?/p>
本文来自CSDN博客Q{载请标明出处Q?a >http://blog.csdn.net/haoel/archive/2009/05/30/4225974.aspx
E序员是一个比较特D的体Q他们因为长期和电脑打交道所L的性格和脾气也是比较相q的。当Ӟ既然是hQ当然是会有性格的,也是会有脾气的。下面,让我来看看十件能把程序惹毛了的事情。一斚w我们可以看看E序员的共性,另一斚w我们也可以看看程序员的缺炏V无论怎么P我都希望他们对你的日常工作都是一U帮助?/p>
W十?E序注释
E序注释本来是一些比较好的习惯,当程序员老手带新手的时候,L会告诉新手,一定要写程序注释。于是,新手们当然会听从老手的吩咐。只不过Q他们可能对E序注释有些误解Q于是,我们l常在程序中看到一些如下的注释Q?/p>
r = n/2; //r是n的一?/span>
//循环Q仅当r- n/r不大于t
while ((r-n/r) <=t){
… …
r = 0.5 * (r-n/r); // 讄r变量
}
每当看到q样的注释——只注释是什么,而不注释Z么,怿你一定会被惹火,q是谁写的程序注释啊Q不找来骂一看来是不会解气了。程序注释应该是告诉别h你的意图和想法,而不是告诉别人程序的语法Q这是ؓ了程序的易读性和可维护性,q样的ؓ了注释而注释的注释Q分明不是在注释Q而是在挑衅,Ҏ别h当然毋庸|疑?/p>
W九?打断
正当E序沉浸于编E算法的思考,或是灉|H现正在书写E序的时候,但却遭到别h的打断,那是一仉常痛苦的事情Q如果被持箋打断Q那可能会让Z下子qwv来。打断别人的人在q种情况下是非常不礼貌的。被打断的h像函数调用一下,当其q回Ӟ需要重新恢复断Ҏ的现场,当然Qh不是电脑Q恢复现场通常是一个很痛苦的过E,极端的情况下可能需要从头开始寻找思AQ然后一点一点地回到断点?/p>
因此Q我看到一些程序员在需要安静不被打扰的时候,要么会选择M个没人找得到的地方,要么会在自己的桌子上斚w挂一个条q以CZ人—?#8220;本h正执行内核程序,无法中断Q请勉K扎ͼ谢谢Q?#8221;Q可能正在沉怺工作的程序被打断是多么大的开销。自Ӟ被打断所Ҏ了的Z不在数了?/p>
W八?nbsp; 需求变?/strong>
q个事情估计不用多说了。只要是是程序员Q面寚w求变化的时候可能L很无奈的。一ơ两ơ可能还要吧接受Q但也顶不住l常变啊。据说敏捷开发中有一套方法论可以让程序员们n受需求的变化Q不知道是真是假。不q,今天让你做一个书桌,没有让你把书桌改成餐桌,后天让你把餐桌改成双人床Q大后天让你把床Ҏ木屋,然后把小木屋再改成高楼大厦。哎Q是人都会被Ҏ了的。那些h只用30分钟的会议就可以作出M军_Q但后面那几十个E序员需要搭上几百个时的辛苦工作。如果是我,可能我也需要神兽草泥马帮助解解气了?/p>
不过Q这也正说明了,E序员ƈ不懂得怎么和用h通,而用户也不懂得和E序员沟通,如果一个项目没有一个中间hQ如QPMQ在其中协调的话Q那么整个项目可能就?#8220;鸡同鸭讲”Q用户和E序员都会被Ҏ所Ҏ了。如果要例D几个用户被惹毛的事情Q估计程序员的U一根筋的只从技术实C思考问题的Ҏ应该也能排进?名?/p>
W七?nbsp; l理不懂技?/strong>
外行领导内行的事例还吗Q领g句话Q无论对不对Q都是对的,我们必需照做Q那怕是多么愚蠢多么错误的决定,我们也得照做。程序员其实q不怕经理不懂技术,最怕的是不懂技术的l理装着很懂技术。最可气的是Q当你据理力争的挑站领导权威的时候,领导q把你视为异cR哎Q想赯L领导别说是骂ZQ打人的冲动都有了?/p>
其实Q经理只不过是一个团队的支持者,他应该帮助团队,为团队排忧解难。而不是对团队发号施o。其实管理真的很单,如果懂的话,帮着做,如果不懂的话Q就怿下属Q放手让下属做。最怕的是又不懂技术,q不信Q下属的经理了。哎Q这真是E序员的痛啊?/p>
W六?用户文
用户文本来不应该那么的令hx。这些文档记录了一切和我们所开发的软g有关的一些话题。因为我们ƈ不知道我们所面对的用L电脑操作基础是什么样的,所以,在写下这L文的时候,我们必需假设q个用户什么也不懂。于是,需要用最清楚Q最漂亮的语a写下一个最丰富的文。那怕一个拷贝粘贴的操作Q可能我们都要分成五、六步来完成Q那怕是一个配|IP地址的操作,我们也要从开始菜单开始一步一步的描述。对于程序员来说Q他们在开发过E中几乎天天都在使用自己开发的软gQ到最后,可能都有得有点吐了,但还得从最单的部䆾写这些文,当然Ҏ令他们烦燥,让程序员来完成这L文档可能效果会非怸好。所以,对于q样的用h,应该׃门的人来完成和维护?/p>
W五?nbsp; 没有文
正如上一条所说的Q程序员本来׃喜欢写文,而因为技术h员的表达能力和写作能力一般都不是太好Q所以,文档写的也很烂。看看开源社会的文档可能q道了。但是,我们可爱的程序员另一斚w最生气的却是因为没有文档。当Ӟ让面说是的用L文档Q这里我们说的是开发方面的文Q比如设计文,功能规格Q维护文等{。不q,基本上都是一L。反正,一斚wQ我们的E序员不喜欢写文,另一斚wQ我们的E序又会被抱怨没有文,文档太少Q或者文档看不懂。呵c原来在抱怨方面也有递归啊。据_敏捷开发可以降低程序开发中的文,据说他们可以把代码写得跟文和示图似的,不知道是真是假。不q,我听q太多太多的E序员抱怨没文太少Q文档太差了Q这个方面要怪还是怪程序员自己?/p>
W四?部v环境
虽然Q程序员们开发的是YӞ但是我们q不知道我们的程序会被部|或安装在什么样的环境下Q比如,|络上的不同QRAID上的不同QBIOS上的不同Q操作系l的不同QWinXP和Win2003Q,有没有杀毒YӞ和其它程序是否兼容,pȝ中有氓软g或病毒等{。当Ӟ只要你的软g出现错误Q无论是你的E序的问题,q是环境的问题,反正都是你的问题Q你都得全部解决。所以,E序员们q不是简单地在编E,很多时候,q要当好一个不错系l管理员。每当最后确认问题的原因是环境问题的时候,可能E序员都是会心生怨气?/p>
W三?问题报告
“我的软g不工作了”Q?#8220;E序出错?#8221;Q每当我们听到这L问题报告的时候,E序员L感到很痛苦,因ؓq样的问题报告等于什么也没有_但还要程序员d理这U错误。没有明的问题描述Q没有说明如果重现问题,在感觉上Q当然会昑־有点被h质问的感觉,甚至Q在某些时候还掺杂着看不P训斥的语气,当然Q程序员基本上都是很有个性的Q都是Y不吃的dQ所以,每当有这L语气报告问题的时候,他们一般也会把话给回去,当然Q后面自q发生一些不愉快的事情。所以,׃q是需要一个客服部门来帮助我们的程序员和用户做好沟通?/p>
W二?E序员自?/strong>
ҎE序员的可能q是E序员自己,E序员是“相轻”的,他们基本上都是持才傲物的QL觉得自己才是最牛的Q在E序员间Q他们几乎每天都要吵Ӟ而且一吵就吵得脸红脖子_。在他们之间Q他们L被自己惹毛?/p>
E序员,长期和电脑打交道Q编写出的代码电脑L认真的运行,长期L了程序员们目IZ切的性格Q却不知Q这个世界上很多东西q不是能像电脑一P只要我们输入正确的指令它正地q行q么单。程序员Q什么时候才能变成成熟v?#8230;…
W一?E序员的代码
无论你当时觉得自q设计和写的代码如何的漂亮和经典,q上一D|间后Q再回头看看Q你必然会觉得自q愚蠢。当Ӟ当你需要去l护他h的代码的时候,你一定要在一边维护中一边臭骂别人的代码。是否你q记得当初怎么怎么牛气地和别h讨论自己的设计和自己的代码如何如何完的Q可是,用不了两q_一刚从学校毕业的学生在l护你的代码的过E当中就可以对你的代码指指点点,你的颜面完全扫地。呵c当Ӟ也有的h始终觉得自己的设计和代码是最好的Q不q这是用一U比较静止的眼光来看问题。编E这个世界变化L很快的的Q很多事情,只有当我们做q,我们才熟悉他Q熟悉了后才知道什么是更好的方法,q是循序渐进的。所以,当你对事情越来越熟悉的时候,再回头看自己以前做的设计和代码的时候,必然会觉得自q肤浅和愚蠢,当然看别人的设计和代码时Q可能也会开始骂Z?/p>
1. 妈妈搞破?/p>
2. l我做䆾三明沅R看懂的举手
3. 代码q在~译?/p>
4. 软g需?/p>