这就是匹克你好世界的样子

2020-05-17 16:47:43

每个人以前都做过“你好世界”节目。但现在我已经有了几年的语言使用经验,我开始提出一个最紧迫的问题--我们如何让C语言的Hello World变得尽可能错综复杂和难以理解?这篇帖子记录了我试图做到这一点的睡眠不足的最终结果。

我很快意识到,我必须首先设置一些基本规则,以便对“无用”的代码行有一个合理的限制:

因为我们使用的是纯C语言,所以不会有类(所以没有HelloWorldFactoryFactoryFactorySingletons)。

所有的#include指令都应该是程序所必需的(因此不会链接十亿个.h文件)。

每个函数必须对程序做一些基本的事情(所以没有函数只调用另一个或无用的#定义)。

该程序不接受任何输入,并编写Hello World!精确到终点站(这样就不会进行其他计算)。

这样,我们就开始使用malloc在单独的函数中构建字符串:

#include<;stdio.h>;#include<;stdlib.h>;char*Generate_Words(){char*ret=malloc(13);ret[0]=';H';;ret[1]=';e';;ret[2]=';l';;ret[3]=';l';;ret[4]='。o';;ret[5]=';ret[6]=';W';;ret[7]=';o';ret[8]=';r';;ret[9]=';l';;ret[10]=';d';;ret[11]=';!';;ret[12]=';\0';;//不能忘记我们的空运算符!return ret;}int main(){char*ret=Generate_word();printf(Ret);free(Ret);return 0;}

这已经比以前复杂多了,但我们可以把它弄得更糟!将字母的直接赋值替换为按位运算,我们就会得到这样的怪异效果:

#include<;stdio.h>;#include<;stdlib.h>;char*Generate_Words(){char*ret=malloc(12);char c=0x01;ret[0]=(c<;<;6)|(c<;<;3);//H is 0x48 ret[1]=c|(c<;<;2)|(c。5)|(c<;<;6);//';e';is 101 ret[2]=((c|(c<;<;1))<;<;2)|(c|(c<;<;1))<;<;5);//';l';is 108 ret[3]=(c|(c<;<;1))<;<;2)|(c|(c<;<;1))<;<;5);//';l';is 108 ret[4]=(c|(c<;<;1))|((c|(c<;<;1)<;<;2)|((c|(c<;<;1))<;<;5);//';o';is 111 ret[5]=(c<;<;5);//';';is 32 ret[6]=c|(c<;<;2)|(c<;<;1)|(c<;<;1)<;<;3|(c<;<;1)<;<;5;//';W';is 87 ret[7]=(c|(c<;<;1))|((c|(c<;<;1))<;<;2)|(c|(c<;<;1))<;<;5);//';o';is 111 ret[8]=(c<;<;1)|((c<;<;2)|c)<;<;4;//';r';is 114 ret[9]=((c|(c<;<;1))<;<;2)|((c|(c<;<;1)<;<;5);//';l';is 108 ret[10]=(c<;<;2)|(c<;<;5)|(c<;<;6);//';d';is 100 ret[11]=(c<;<;5)|c;//';!';is 33 return ret;}int main(){char*ret=Generate_word();printf(Ret);free(Ret);return 0;}。

如您所见,出于可读性的考虑,我添加了注释和一些额外的括号。但是,如果我们删除c变量以节省空间,并且只依赖于先前在ret中定义的值进行计算,结果会怎样呢?

#include<;stdio.h>;#include<;stdlib.h>;#include<;string.h>;#include<;stdio.h>;#include<;stdlib.h>;#include<;string.h>;#include<;unistd.h>;volatile u_int8_t a=0-1;volatile u_int8。z=ALIGNED_ALLOC(sysconf(_SC_LEVE1_DCACHE_LINESIZE),1*10+3):a!=1*10+3?Z[a]=a==0?z[a]=(1<;<;(a+6))|(1<;<;(a+3)):a==1?(Z[a-1]&;(1<;<;(a+5))|(z[a-1]>;>;a)|(z[a-1]>;>;(A+5)):A==2?z[a-2]|z[1]&;~(z[a-2]>;>;(a+4):a==4?z[a-2]|z[a-3]|(z[a-4]>;>;(a+1)):a==5?(z[a-4]&;z[a-3]&;z[a-5]>;>;(a-4):a==6?(Z[a-2]&;~z[a-1]|(z[a-6]>;>;(a-4))&;~(z[a-6]>;>;(a-2)<;<;(a-5):a==8?(~z[a-7]&;z[a-2])|z[a-3]|z[a-3]<;<;(a-7):a==10?z[a-9]&;~(z[a-5]>;>;(a-5)):a==11?z[a-6]|(z[a-1]&;z[a-3])>;>;(a-5)):a-a:0;if(a==1*10+3){memcpy(z+3,z+2,1);memcpy(z+9,z+3,1);memcpy(z+7,z+4,1);printf(";%s";,z);free(Z);return 0;}a=a+1;main();}u_int8_t*Generate_Words(){u_int8_t*ret=malloc(13);ret[0]=(1<;<;6)|(1<;<;3);ret[1]=(ret[0]&;(1<;<;6))|(ret[0]>;>;1)|(ret[0]>;>;6);ret[2]=ret[0]|ret[1]&;~(ret[0]>;>;6);ret[4]=ret[2]|ret[1]|(ret[0]>;>;5);ret[5]=(ret[1]&;ret[2]&;ret[0])>;>;1;ret[6]=(ret[4]&;~ret[5]|(ret[0]>;>;2))&;~(ret[0]>;>;4<;<;1);ret[8]=(~ret[1]&;ret[6])|ret[5]|ret[5]<;<;1;ret[10]=ret[1]&;~(ret[5]>;>;5);ret[11]=ret[5]|((ret[10]&;ret[8])>;>;6);ret[12]=0;memcpy(ret+3,ret+2,1);memcpy(ret+9,ret+3,1);memcpy(ret+7,ret+4,1);ret[12]=0;return ret;}int main(){u_int8_t*ret=Generate_Words();printf(";%s";,ret);free(Ret);return 0;}。

现在,我们的代码开始看起来很好(不好?)。唯一的问题是它运行的时间太长了--我两年前的超级强大的笔记本电脑处理器几乎花了我两年的时间

等等,我们添加的for循环可以用更复杂的方式编写!让我们这样做:

#include<;stdio.h>;#include<;stdlib.h>;#include<;string.h>;#include<;unistd.h>;Volatile unsign int a=0-1;volatile u_int8_t*z=null;int main(){switch(A){case 0-1:z=aligned_alloc(sysconf(_SC_level 1_DCACHE_LINC。案例1*10+3:memcpy(z+3,z+2,1);memcpy(z+9,z+3,1);memcpy(z+7,z+4,1);printf(";%s";,z);free(Z);返回0;默认值:z[a]=a==0?z[a]=(1<;<;(a+6))|(1<;<;(a+3)):a==1?(Z[a-1]&;(1<;<;(a+5))|(z[a-1]>;>;a)|(z[a-1]>;>;(A+5)):A==2?z[a-2]|z[1]&;~(z[a-2]>;>;(a+4):a==4?z[a-2]|z[a-3]|(z[a-4]>;>;(a+1)):a==5?(z[a-4]&;z[a-3]&;z[a-5]>;>;(a-4):a==6?(Z[a-2]&;~z[a-1]|(z[a-6]>;>;(a-4))&;~(z[a-6]>;>;(a-2)<;<;(a-5):a==8?(~z[a-7]&;z[a-2])|z[a-3]|z[a-3]<;<;(a-7):a==10?z[a-9]&;~(z[a-5]>;>;(a-5)):a==11?z[a-6]|((z[a-1]&;z[a-3])>;>;(a-5):a-a;}a=a+1;main();}。

嗯,我们在那里的交换机占用了相当大的空间,不是吗?让我们解决这个问题,并稍微清理一下代码:

#include<;stdio.h>;#include<;stdlib.h>;#include<;string.h>;#include<;unistd.h>;volatile u_int8_ta a=0-1;volatile u_int8_t*z=null;int main(){a=0-1?z=ALIGNED_ALLOC(sysconf(_SC_LEVE1_DCACHE_LINESIZE),1*10+3):a!=1*10+3?Z[a]=a==0?z[a]=(1<;<;(a+6))|(1<;<;(a+3)):a==1?(Z[a-1]&;(1<;<;(a+5))|(z[a-1]>;>;a)|(z[a-1]>;>;(a+5)):a==2?z[a-2]|z[1]&;~(z[a-2]>;>;(a+4):a==4?z[a-2]|z[a-3]|(z[a-4]>;>;(a+1)):a==5?(z[a-4]&;z[a-3]&;z[a-5]>;>;(a-4):a==6?(z[a-2]&;~z[a-1]|(z[a-6]>;>;>;(a-4))&;~(z[a-6]>;>;(a-2)<;<;(a-5):a==8?(~z[a-7]&;z[a-2])|z[a-3]|z[a-3]<;<;(a-7):a==10?z[a-9]&;~(z[a-5]>;>;(a-5)):a==11?z[a-6]|(z[a-1]&;z[a-3])>;>;(a-5)):a-a:0;if(a==1*10+3){memcpy(z+3,z+2,1);memcpy(z+9,z+3,1);memcpy(z+7,z+4,1);printf(";%s";,z)。Main();}。

现在开始了--一个仅用一行逻辑打印Hello World的程序!

我相信有更多的方法可以改善这个项目的不可读性,所以如果你看到可以改进的地方,请让我知道!