原文:http://cocre.com/?p=933 —— 酷壳

之前发表了《6个变态的C语言Hello World程序》[酷壳链接] [CSDN链接],主要是是像大家展示了一些C语言的变态玩法。也向大家展示了一下程序是可以写得让人看不懂的,在那篇文章中,可以看到很多人的留言,很多人都觉得很好玩,是的,那本来是用来供朋友们“消遣作乐”,供娱乐娱东而已,不必太过认真。

不过,通过这种极端的写法,大家可以看到源代码都可以写得那么复杂难懂的。大家也许在赞叹之余一笑了之,而我则希望,大家能够在娱乐以后认真思考一下,你不要以为咱们自己不会把代码搞得那么复杂,只不过没有像那6个Hello World一样那么极端,不过,说句老实话,咱们每个程序都有把清晰的程序搞得一团混乱的潜能,只不过程度不一样罢了,我并不是在这里危言耸听,大家好自为之

下面是一个Step by Step的教程,教你如何把一个清晰的代码变得复杂难懂的。当然,这只是一个“简明教程”了。还是那句话——“本文仅供朋友们“消遣作乐”,如果你要觉得有意思的话,顶个贴。如果你觉得没什么意思的话,一笑了之。仅供娱乐而已,不必太过认真。”

正常程序

下面是一个找出素数的程序:

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);
}

程序到这里应该差不多了。还是那句话——“每一个程序员都有把源代码弄复杂的潜质”,大家好自为之。

如何加密/弄乱C源代码相关推荐

  1. php字符串加密解密源码,PHP中加密解密字符串函数源代码

    PHP中加密解密字符串函数源代码: /** *功能:对字符串进行加密处理 *参数一:需要加密的内容 *参数二:密钥 */ function passport_encrypt($str,$key){ / ...

  2. swoolephp加密_PHP中给源代码加密的几种方法

    商业使用推荐 Swoole Compiler 代码加密 以下是如何通过PHP的自定义函数来加密我们的PHP源代码 方法一 function encode_file_contents($filename ...

  3. PHP-Beast 加密你的PHP源代码

    php-beast.png 前言 首先说说为什么要用PHP-Beast? 有时候我们的代码会放到代理商上, 所以很有可能代码被盗取,或者我们写了一个商业系统而且不希望代码开源,所以这时候就需要加密我们 ...

  4. c语言程序中如何加密密码,在C源代码中加密密码

    有没有办法以一种在编译的应用程序中很难找到的方式保存静态密码? 我需要两个不同的应用程序.一个是Windows的轻量级FTP客户端,只连接到一个硬编码服务器. 另一个是Objective C游戏,它允 ...

  5. 安装好机器学习环境的虚拟机_虚拟环境之外的数据科学是弄乱机器的好方法

    安装好机器学习环境的虚拟机 While doing startup data science, I've seen machines get into unhelpful states due to ...

  6. Ecilpse操作界面窗口不小心弄乱了怎么办,窗口恢复

    Window->Perspective->Reset Perspective

  7. python怎么变大字体_python – 更改字体大小而不会弄乱Tkinter按钮大小

    我无法在Tkinter中更改按钮的字体大小,当我尝试这样做时,按钮也会根据文本的大小进行扩展/收缩.有没有办法可以改变文本大小,按钮的大小固定在原位? 我在设计一个井字应用程序时遇到了这个问题,但是为 ...

  8. c语言如何实现正负交替输出指令,C语言的谜题

    这几天,本站推出了几篇关于C语言的很多文章如下所示: 语言的歧义 [酷壳链接] [CSDN链接] 谁说C语言很简单? [酷壳链接] [CSDN链接] 6个变态的C语言Hello World程序 [酷壳 ...

  9. C/C++重要知识点

    成员以其在类中声明的顺序构造 摘要: 分析以下代码的输出:#includeusing namespace std;class A{public: A(int j):age(j) , num(age + ...

最新文章

  1. 现在的学生太强了,徒手撸了一个小米商城项目(附源码)!
  2. The RAII Programming Idiom
  3. golang的WaitGroup
  4. java 匿名函数 构造_Java匿名内部类与Lambda表达式
  5. 2014年考研计算机大纲解析:数据结构,2014年考研计算机大纲解析之数据结构
  6. MySQL数据库优化技巧
  7. RuoYi-Cloud 部署篇_03(windows环境 mysql版本)
  8. Android之旅--Handler与多线程
  9. 论文笔记:STD2P: RGBD Semantic Segmentation Using Spatio-Temporal Data-Driven Pooling
  10. 大数运算python编程实现
  11. idea编辑窗口显示outdated version解决方案
  12. 金仓数据库字段_金仓数据库认证工程师(KCE)考试试题_含答案_
  13. greenDao的使用与封装
  14. Opencv实战——OCR文档扫描
  15. CSS中clientHeight、offsetHeight、scrollHeight、scrollTop、scrollTo几者的区别和关联
  16. 行业轮动策略(附策略源码)
  17. angr原理与实践(三)——Arbiter:一种弥合二进制程序漏洞发现中的静态和动态鸿沟
  18. IOS开发之——上传-文件上传(01)
  19. Linux (centos) 安装anyproxy https手机设备抓包笔记
  20. 物流大数据平台-物流流向分析(二)

热门文章

  1. Redhat7使用centos7的YUM的方法
  2. 【面经】今天又一名读者斩获蚂蚁金服Offer,就是这么简单!!
  3. Android开发三:数据库设计及应用(一)
  4. 99、汽车库、修车库的安全疏散要求
  5. 编码算法(URL编码和Base64编码)
  6. 一款全面高效的日志分析工具,操作更简单
  7. Resin 3.0.14 和 IIS6 整合
  8. 用VC++进行MapX二次开发::之三------使用MapX工具
  9. [别被脱裤系列]2 还没深入数据库就浅出了
  10. Houdini实现AO效果