主要是是像大家展示了一些C語(yǔ)言的變態(tài)玩法。也向大家展示了一下程序是可以寫得讓人看不懂的,在那篇文章中,可以看到很多人的留言,很多人都覺(jué)得很好玩,是的,那本來(lái)是用來(lái)供朋友們“消遣作樂(lè)”,供娛樂(lè)娛東而已,不必太過(guò)認(rèn)真。
不過(guò),通過(guò)這種極端的寫法,大家可以看到源代碼都可以寫得那么復(fù)雜難懂的。大家也許在贊嘆之余一笑了之,而我則希望,大家能夠在娛樂(lè)以后認(rèn)真思考一下,你不要以為咱們自己不會(huì)把代碼搞得那么復(fù)雜,只不過(guò)沒(méi)有像那6個(gè)Hello World一樣那么極端,不過(guò),說(shuō)句老實(shí)話,咱們每個(gè)程序都有把清晰的程序搞得一團(tuán)混亂的潛能,只不過(guò)程度不一樣罷了,我并不是在這里危言聳聽(tīng),大家好自為之。
下面是一個(gè)Step by Step的教程,教你如何把一個(gè)清晰的代碼變得復(fù)雜難懂的。當(dāng)然,這只是一個(gè)“簡(jiǎn)明教程”了。還是那句話——“本文僅供朋友們“消遣作樂(lè)”,如果你要覺(jué)得有意思的話,頂個(gè)貼。如果你覺(jué)得沒(méi)什么意思的話,一笑了之。僅供娛樂(lè)而已,不必太過(guò)認(rèn)真。”
正常程序
下面是一個(gè)找出素?cái)?shù)的程序:
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);
}
下面我們來(lái)看看如何把上面這段代碼搞得復(fù)雜難懂。
第一步、把for變成while
通常來(lái)說(shuō),for循壞要以while循壞簡(jiǎn)單一些,上面的程序有二重for循環(huán),我們不但要把其變成while循環(huán),而且還要把二重循環(huán)的變成一重的循環(huán),然后使用大量的if-else語(yǔ)句來(lái)判斷。
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);
}
第二步,把循壞變成遞歸
遞歸在某些時(shí)候是可以把代碼變得簡(jiǎn)單,但大多數(shù)的情況下是把代碼變得復(fù)雜,而且很沒(méi)有效率。下面是把上面的while循環(huán)變成了遞歸。變成了遞歸后,函數(shù)的參數(shù)都變成3個(gè)了。
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);
}
第三步,弄亂代碼結(jié)構(gòu)/使用沒(méi)有含義的變量名
關(guān)于如何弄亂代碼結(jié)構(gòu),其中一個(gè)小技巧是,使用“?”表達(dá)式代替if-else語(yǔ)句。
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);
}
第四步,取消臨時(shí)變量
臨時(shí)變量一般用來(lái)保存反復(fù)使用的一個(gè)表達(dá)式的值。使用大量重復(fù)的表達(dá)式來(lái)取消這些臨時(shí)變量的也可以讓代碼復(fù)雜起來(lái)。
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);
}
第五步,繼續(xù)弄亂變量名
我們知道,下劃線是合法的變量名,所以,我們不妨用__,___,____來(lái)代替m,t,c。函數(shù)名也可以使用下劃線來(lái)代替。讓我們來(lái)看看求素?cái)?shù)的函數(shù)能變成什么。
void _(int __, int ___, int ____)
{
((___ / __) <= 1) ? _(__,___+1,____) : !(___ % __) ? _(__,___+1,___ % __) :
((___ % __)==(___ / __) && !____) ? (printf("%d\t",(___ / __)),
_(__,___+1,____)) : ((___ % __) > 1 && (___ % __) < (___ / __)) ?
_(__,___+1,____ + !((___ / __) % (___ % __))) : (___ < __ * __) ?
_(__,___+1,____) : 0;
}
int main()
{
_(100,0,0);
}
第六步,移除常量
在上面的程序中,還有一些常量,你可以通過(guò)增加一個(gè)宏定義,或是增加一個(gè)函數(shù)的形參來(lái)取代這一常量。
void _(int __, int ___, int ____, int _____)
{
((___ / __) <= _____) ? _(__,___+_____,____,_____) : !(___ % __) ? _(__,___+_____,___ % __, _____) :
((___ % __)==(___ / __) && !____) ? (printf("%d\t",(___ / __)),
_(__,___+_____,____,_____)) : ((___ % __) > _____ && (___ % __) < (___ / __)) ?
_(__,___+_____,____,_____ + !((___ / __) % (___ % __))) : (___ < __ * __) ?
_(__,___+_____,____,_____) : 0;
}
int main() {
_(100,0,0,1);
}
程序到這里應(yīng)該差不多了。還是那句話——“每一個(gè)程序員都有把源代碼弄復(fù)雜的潛質(zhì)”,大家好自為之。
本文來(lái)自CSDN博客,轉(zhuǎn)載請(qǐng)標(biāo)明出處:http://blog.csdn.net/haoel/archive/2009/05/30/4225974.aspx