原文:http://cocre.com/?p=933—— 酷壳
之前发表了《6个变态的C语言Hello World程序》[酷壳链接] [CSDN链接],主要是是像大家展示了一些C语言的变态玩法。也向大家展示了一下程序是可以写得让人看不懂的,在那篇文章中,可以看到很多人的留言,很多人都觉得很好玩,是的,那本来是用来供朋友们“消遣作乐”,供娱乐娱东而已,不必太过认真。
不过,通过这种极端的写法,大家可以看到源代码都可以写得那么复杂难懂的。大家也许在赞叹之余一笑了之,而我则希望,大家能够在娱乐以后认真思考一下,你不要以为咱们自己不会把代码搞得那么复杂,只不过没有像那6个Hello World一样那么极端,不过,说句老实话,咱们每个程序都有把清晰的程序搞得一团混乱的潜能,只不过程度不一样罢了,我并不是在这里危言耸听,大家好自为之。
下面是一个Step by Step的教程,教你如何把一个清晰的代码变得复杂难懂的。当然,这只是一个“简明教程”了。还是那句话——“本文仅供朋友们“消遣作乐”,如果你要觉得有意思的话,顶个贴。如果你觉得没什么意思的话,一笑了之。仅供娱乐而已,不必太过认真。”
<!--more-->
正常程序
下面是一个找出素数的程序:
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);
}
下面我们来看看如何把上面这段代码搞得复杂难懂。
第一步、把for变成while
通常来说,for循坏要以while循坏简单一些,上面的程序有二重for循环,我们不但要把其变成while循环,而且还要把二重循环的变成一重的循环,然后使用大量的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);
}
第二步,把循坏变成递归
递归在某些时候是可以把代码变得简单,但大多数的情况下是把代码变得复杂,而且很没有效率。下面是把上面的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);
}
第三步,弄乱代码结构/使用没有含义的变量名
关于如何弄乱代码结构,其中一个小技巧是,使用“?”表达式代替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);
}
第四步,取消临时变量
临时变量一般用来保存反复使用的一个表达式的值。使用大量重复的表达式来取消这些临时变量的也可以让代码复杂起来。
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);
}
第五步,继续弄乱变量名
我们知道,下划线是合法的变量名,所以,我们不妨用__,___,____来代替m,t,c。函数名也可以使用下划线来代替。让我们来看看求素数的函数能变成什么。
void _(int __, int ___, int ____)
{
((___ / __) <= 1) ? _(__,___+1,____) : !(___ % __) ? _(__,___+1,___ % __) :
((___ % __)==(___ / __) && !____) ? (printf("%d\t",(___ / __)),
_(__,___+1,____)) : ((___ % __) > 1 && (___ % __) < (___ / __)) ?
_(__,___+1,____ + !((___ / __) % (___ % __))) : (___ < __ * __) ?
_(__,___+1,____) : 0;
}
int main()
{
_(100,0,0);
}
第六步,移除常量
在上面的程序中,还有一些常量,你可以通过增加一个宏定义,或是增加一个函数的形参来取代这一常量。
void _(int __, int ___, int ____, int _____)
{
((___ / __) <= _____) ? _(__,___+_____,____,_____) : !(___ % __) ? _(__,___+_____,___ % __, _____) :
((___ % __)==(___ / __) && !____) ? (printf("%d\t",(___ / __)),
_(__,___+_____,____,_____)) : ((___ % __) > _____ && (___ % __) < (___ / __)) ?
_(__,___+_____,____,_____ + !((___ / __) % (___ % __))) : (___ < __ * __) ?
_(__,___+_____,____,_____) : 0;
}
int main() {
_(100,0,0,1);
}
程序到这里应该差不多了。还是那句话——“每一个程序员都有把源代码弄复杂的潜质”,大家好自为之。
分享到:
相关推荐
### 第三步:弄乱代码结构/使用无意义的变量名 通过使用“?”运算符替换if-else语句,以及使用诸如`____`, `_____`等不易理解的变量名,可以进一步混淆代码。 ```c // 混淆代码结构后的示例... ``` ### 第四步:...
197 SIX/NINE问题 C语言源代码文件
μC/OS-II源代码的学习能够帮助开发者深入理解RTOS的工作原理,并在嵌入式系统设计中实现更高级别的功能。 μC/OS-II的核心组件包括以下几个方面: 1. **任务管理**:μC/OS-II支持多任务并行执行,通过任务调度器...
在提供的C语言源代码中,`des.c`文件很可能是实现这些步骤的函数集合。可能包含的函数有`des_encrypt()`用于加密,`des_decrypt()`用于解密,以及辅助函数如`initial_permutation()`、`permutation_function_1()`等...
本人实测可以使用,基于C的AES算法代码,希望能帮到有需要的。以下是相关模式调用的函数。 void AES_init_ctx(struct AES_ctx* ctx, const uint8_t* key); void AES_init_ctx_iv(struct AES_ctx* ctx, const uint8_t...
本资源包"**C++类库源代码(加密/字符串/接口)**"包含了一系列针对C++编程中的关键功能的类库源代码,包括加密算法实现、字符串操作以及与SYBASE数据库交互的接口。这些源代码可以直接用于项目中,为开发者提供了...
【标题】:“俄罗斯方块”是一款经典的电子游戏,它的C语言源代码是学习C语言编程、游戏开发和算法实现的良好实例。通过分析和理解这段源代码,你可以深入了解C语言的基本语法,以及如何利用循环、条件判断等结构...
C语言源代码.zip
《深入理解H.264:C语言源代码解析》 H.264是一种高效、先进的视频编码标准,广泛应用于数字电视、网络流媒体、移动通信等领域。它通过复杂的算法实现了高压缩比,能够在有限的带宽下传输高质量的视频。本资料包...
标题和描述中提到的"C/C++源代码网站"是指一系列在线平台,这些平台提供C和C++编程语言的源代码示例、库、组件和项目,对于学习和开发C/C++程序的人来说是非常宝贵的资源。以下是对这些网站及其提供的内容的详细说明...
C标准库源代码,能提高对C的理解,不错的哦 下载文件列表 Pack : clibsource.rar C 标准库源代码\ABORT.C C标准库源代码\ABS.C C标准库源代码\ACCESS.C C标准库源代码\ADJUSTFD.C C标准库源代码\ALGRITHM C标准库源...
这是一份实现AES算法的C语言源代码和描述AES算法的详细文档,AES是更高级的加密算法,为了便于理解算法的代码实现,下载包中给出了一份详细中文注释的阅读代码,希望这份文档能让你学会AES算法,并结合程序的实现来...
通过对“MH背包密码算法”的原理学习和源代码实践,不仅可以掌握一种非对称加密方法,还能锻炼C/C++编程能力。然而,密码学发展迅速,安全性更高的算法不断出现,因此,持续学习和了解最新密码学技术至关重要。同时...
在"C语言源代码大全(图像篇)"这个资源中,我们聚焦于使用C语言进行图像图形编程的实践。C语言虽然不像高级语言那样内置丰富的图形库,但它仍然是编写底层图形处理程序的强大工具,尤其在与操作系统接口或者进行高...
具体到这款软件,它包含一个名为“加密2.exe”的可执行文件,该文件是基于C语言源代码编译生成的,确保了其稳定性和可靠性。此类程序的开发和发布,意味着用户可以亲自审查源代码,以验证程序的透明性和安全性。这种...
本压缩包“C语言经典编程源代码打包下载,共900例.rar”包含了900个C语言的源代码实例,是学习和提升C编程技能的宝贵资源。这些实例涵盖了C语言的基础知识到进阶应用,对于初学者和有经验的开发者都具有很高的参考...
《深入理解IEEE802.11 a/b/g客户端应用程序源代码》 在无线网络领域,IEEE802.11标准占据着至关重要的地位,它定义了无线局域网(WLAN)通信的规范。其中,802.11 a/b/g是常见的三种子标准,分别对应不同的频段和...
【超级玛丽C语言源代码】是一份珍贵的学习资源,它揭示了如何用C语言实现经典游戏《超级玛丽》的核心逻辑和功能。对于想深入理解游戏编程、C语言应用或者想要自己动手开发类似游戏的程序员来说,这是一个绝佳的参考...
在中国象棋C语言源代码项目中,我们主要探讨的是如何使用C编程语言来实现一个功能完备的中国象棋游戏。C语言是一种底层、高效的编程语言,适用于开发系统软件和各种应用软件,包括游戏。以下是对这个项目的详细分析...
这个项目的源代码可能会包含多个文件,如`snake.c`(主程序)、`easyx.h`(EasyX库的头文件)等。通过阅读和分析源代码,初学者可以了解到C语言的基本结构、函数调用、条件语句、循环语句以及如何使用图形库来实现...