6个变态的C语言Hello World程序——更好的理解C(4、5、6)

hello4.c

[cpp] view plaincopyprint?

  1. main(){int i,n[]={(((1<<1)<<(1<<1)<<(1<<
  2. 1)<<(1<<(1>>1)))+((1<<1)<<(1<<1))), (((1
  3. <<1)<<(1<<1)<<(1<<1)<<(1<<1))-((1<<1)<<(
  4. 1<<1)<<(1<<1))+((1<<1)<<(1<<(1>>1)))+ (1
  5. <<(1>>1))),(((1<<1)<<(1<<1)<<(1<<1)<< (1
  6. <<1))-((1<<1)<<(1<<1)<<(1<<(1>>1)))- ((1
  7. <<1)<<(1<<(1>>1)))),(((1<<1)<<(1<<1)<<(1
  8. <<1)<<(1<<1))-((1<<1)<<(1<<1)<<(1<<(1>>1
  9. )))-((1<<1)<<(1<<(1>>1)))),(((1<<1)<< (1
  10. <<1)<<(1<<1)<<(1<<1))-((1<<1)<<(1<<1)<<(
  11. 1<<(1>>1)))-(1<<(1>>1))),(((1<<1)<<(1<<1
  12. )<<(1<<1))+((1<<1)<<(1<<1)<<(1<<(1>>1)))
  13. -((1<<1)<<(1<<(1>>1)))),((1<<1)<< (1<<1)
  14. <<(1<<1)),(((1<<1)<<(1<<1)<<(1<<1)<<(1<<
  15. 1))-((1<<1)<<(1<<1))-(1<<(1>>1))),(((1<<
  16. 1)<<(1<<1)<<(1<<1)<<(1<<1))-((1<<1)<< (1
  17. <<1)<<(1<<(1>>1)))-(1<<(1>>1))), (((1<<1
  18. )<<(1<<1)<<(1<<1)<<(1<<1))- ((1<<1)<< (1
  19. <<1)<<(1<<(1>>1)))+(1<<1)), (((1<<1)<< (
  20. 1<<1)<<(1<<1)<< (1<<1))-((1<<1)<< (1<<1)
  21. <<(1<<(1>>1)))-((1<<1) <<(1<< (1>>1)))),
  22. (((1<<1)<< (1<<1)<<(1<<1)<< (1<<1))- ((1
  23. <<1)<<(1<<1)<<(1<<1))+((1<<1)<< (1<<(1>>
  24. 1)))), (((1<<1)<<(1<<1) <<(1<<1))+(1<<(1
  25. >>1))),(((1<<1)<<(1<<1))+((1<<1)<< (1<<(
  26. 1>>1))) + (1<< (1>>1)))}; for(i=(1>>1);i
  27. <(((1<<1) <<(1<<1))+((1 <<1)<< (1<<(1>>1
  28. ))) + (1<<1)); i++) printf("%c",n[i]); }

这段代码看上去比较长比较乱,其实涉及的主要就是C语言位运算中的位移运算:

<<——左移,>>——右移。一般地,左移以为代表乘以2,左移2位代表乘以4;右移一位相当于除2,右移2位代表除4;

上面代码中,主要就是通过位移,依次为整型数组int n[]赋值,分别对应的是“Hello, world!"中各字符的ASCII码值。这个可以自行计算验证。然后用%c格式化输出,将整型转化为ASCII码中对应的字符。

C语言位运算中还涉及到位逻辑运算:

1.单目运算符:~(取反)

2.双目运算:&(按位与) 、 |(按位或)、 ^(按位异或)

hello5.c

[cpp] view plaincopyprint?

  1. #include<stdio.h>
  2. #define __(a) goto a;
  3. #define ___(a) putchar(a);
  4. #define _(a,b) ___(a) __(b);
  5. main()
  6. { _:__(t)a:_(‘r‘,g)b:_(‘$‘,p)
  7. c:_(‘l‘,f)d:_(‘ ‘,s)e:_(‘a‘,s)
  8. f:_(‘o‘,q)g:_(‘l‘,h)h:_(‘d‘,n)
  9. i:_(‘e‘,w)j:_(‘e‘,x)k:_(‘\n‘,z)
  10. l:_(‘H‘,l)m:_(‘X‘,i)n:_(‘!‘,k)
  11. o:_(‘z‘,q)p:_(‘q‘,b)q:_(‘,‘,d)
  12. r:_(‘i‘,l)s:_(‘w‘,v)t:_(‘H‘,j)
  13. u:_(‘a‘,a)v:_(‘o‘,a)w:_(‘)‘,k)
  14. x:_(‘l‘,c)y:_(‘\t‘,g)z:___(0x0)}

这段代码看上去排列比较整齐,但语法比较奇怪。仔细看看,你会发现涉及的主要就两个内容:goto语句的使用以及宏定义的使用。

所有冒号左边的都是语句标号。如mian函数里面的第一句翻译过来为_:goto t;执行这个语句后跳转到语句标号为t的语句,即t:(‘H‘,j),完成所有的宏替换,代码转换为:

[cpp] view plaincopyprint?

  1. main()
  2. {
  3. _:goto t;
  4. a:putchar(‘r‘); goto g;
  5. b:putchar(‘$‘); goto p;
  6. c:putchar(‘l‘); goto f;
  7. d:putchar(‘ ‘); goto s;
  8. e:putchar(‘a‘); goto s;
  9. f:putchar(‘o‘); goto q;
  10. g:putchar(‘l‘); goto h;
  11. h:putchar(‘d‘); goto n;
  12. i:putchar(‘e‘); goto w;
  13. j:putchar(‘e‘); goto x;
  14. k:putchar(‘\n‘); goto z;
  15. l:putchar(‘H‘); goto l;
  16. m:putchar(‘X‘); goto i;
  17. n:putchar(‘!‘); goto k;
  18. o:putchar(‘z‘); goto q;
  19. p:putchar(‘q‘); goto b;
  20. q:putchar(‘,‘); goto d;
  21. r:putchar(‘i‘); goto l;
  22. s:putchar(‘w‘); goto v;
  23. t:putchar(‘H‘); goto j;
  24. u:putchar(‘a‘); goto a;
  25. v:putchar(‘o‘); goto a;
  26. w:putchar(‘)‘); goto k;
  27. x:putchar(‘l‘); goto c;
  28. y:putchar(‘\t‘); goto g;
  29. z:putchar(0x0);
  30. }

语句间的跳转顺序为:

_ >>t>>j>>x>>c>>f>>q>>d>>s>>v>>a>>g>>h>>n>>k>>z

hello6.cpp(注意本程序只能被C++编译器编译)

#include <stdio.h>
    #define _(_) putchar(_);
    int main(void){int i = 0;_(
    ++++++++++++++++++++++++++++
    ++++++++++++++++++++++++++++
    ++++++++++++++++++++++++++++
    ++++++++++++++++++++++++++++
    ++++++++++++++++++++++++++++
    ++++i)_(++++++++++++++++++++
    ++++++++++++++++++++++++++++
    ++++++++++i)_(++++++++++++++
    i)_(--++i)_(++++++i)_(------
    ----------------------------
    ----------------------------
    ----------------------------
    ----------------------------
    ----------------i)_(--------
    ----------------i)_(++++++++
    ++++++++++++++++++++++++++++
    ++++++++++++++++++++++++++++
    ++++++++++++++++++++++++++++
    ++++++++++++++++++++++++++++
    ++++++++++++++++++++++++++++
    ++++++++++++++++++++++++++i)
    _(----------------i)_(++++++
    i)_(------------i)_(--------
    --------i)_(----------------
    ----------------------------
    ----------------------------
    ----------------------------
    ----------------------------
    ------i)_(------------------
    ----------------------------
    i)return i;}

这段代码看上去比较炫,其实是很无聊的,通过自增,自减运算符为 i 赋值,而这些值都是"Hello, world!"字符串中对应字符的ASCII码值,用putchar(c)输出。

写到这儿,六个变态的C语言Hello world程序全部介绍完毕。咋一眼看上去确实不知所云,在我不说明的情况下你鞥一眼辨别程序要输出的是什么吗?我想还是有点困难的。当然 我们不提倡C语言混乱代码,写出一些让人摸不着头脑礼节性差的代码,但通过分析这些混乱的代码,明白其中的道理所在,通过分析,层层解开混乱代码后的神秘面纱,我想这应该也算是学习C语言的乐趣之所在。写出这样的混乱代码,确实是件很酷的事情!

时间: 2024-10-14 10:55:51

6个变态的C语言Hello World程序——更好的理解C(4、5、6)的相关文章

6个变态的C语言Hello World程序——更好的理解C

下面这个程序片段主要完成以下两件事情: 1)完成输出Hello World. 2)混乱C语言代码. #define _________ } #define ________ putchar #define _______ main #define _(a) ________(a); #define ______ _______(){ #define __ ______ _(0x48)_(0x65)_(0x6C)_(0x6C) #define ___ _(0x6F)_(0x2C)_(0x20)_(

6个变态的C语言Hello World程序——更好的理解C(2、3)

接上一篇文章,6个变态的C语言Hello World程序--更好的理解C,这篇文章给大家带来变态的Hello World程序2.3 hello2.c #include<stdio.h> main(){ int x=0,y[14],*z=&y;*(z++)=0x48;*(z++)=y[x++]+0x1D; *(z++)=y[x++]+0x07;*(z++)=y[x++]+0x00;*(z++)=y[x++]+0x03; *(z++)=y[x++]-0x43;*(z++)=y[x++]-0

6个变态的C语言Hello World程序

6个变态的C语言Hello World程序 下面的六个程序片段主要完成这些事情: 输出Hello, World 混乱C语言的源代码 下面的所有程序都可以在GCC下编译通过,只有最后一个需要动用C++的编译器g++才能编程通过. hello1.c 1 2 3 4 5 6 7 8 9 10 11     #define _________ }     #define ________ putchar     #define _______ main     #define _(a) ________

6个变态的C语言Hello World程序 之 雷人的程序语言

以下的六个程序片段主要完毕这些事情: 输出Hello, World 混乱C语言的源码 以下的全部程序都能够在GCC下编译通过,仅仅有最后一个须要动用C++的编译器g++才干编程通过. hello1.c 1 2 3 4 5 6 7 8 9 10 11     #define _________ }     #define ________putchar     #define _______ main     #define _(a) ________(a);     #define ______

用C++语言开发Android程序 配置开发环境

如果你是一个C++语言的死忠,你喜欢C++语言到了偏执的状态,如果不想学习Java语言,或者你很讨厌Java语言,如果你认为Java虚拟机的内存占用太多和执行低效.如果你过度关注Andoird程序的执行效率,对Android程序的执行速度过于敏感,喜欢自己用手动档来控制程序的内存和线程等资源,如果你在其他平台下用C++语言开发了一个程序,想要移植到Android平台下,本教程就是为了满足你的以上诸多怪癖而发布的,本文的目的就是指导你学习如何只用C++语言来开发Android程序,而不使用任何其他

Ubuntu 12.04下在Eclipse IDE for C/C++ Developers中运行C语言的GTK程序

哈哈哈--终于搞定了GTK程序的编译与运行,纠结了近一个月的问题终于得以解决,痛快!近一个月来,不断百度.发博文.百度知道提问.csdn提问--经常发私信.评论博文麻烦大牛,比如sunny2038.轻飘风扬.Sun1956--在此对所有帮助我的人表示感谢! 特别感谢csdn的sunny2038,他的博文<Windows和Ubuntu11.10在Eclipse中配置C和GTK>和热心回复给了我很大的帮助! Neo E. Cai的博文<Ubuntu下GTK的安装.编译和测试>对我具有非

C语言中的程序结构

C语言中的程序结构有三种,分别是顺序结构.选择结构和循环结构. 一.按照语句的先后顺序执行的程序结构,称为顺序结构. 下面以一个求三角形面积的例子进行说明,其代码如下: 例1.1 1 #include<stdio.h> 2 int main() 3 { 4 int width,height,s; 5 printf("请输入三角形的底宽:\n"); 6 scanf("%d",&width); 7 printf("请输入三角形的高:\n&q

c语言拷贝文件程序

#include <stdio.h> #include <stdlib.h> #include <string.h> #define SIZE 1024*1024*10 int main() { FILE *fp_read, *fp_write; fp_read = fopen("E:\\CentOS-6.5\\CentOS-6.5-i386-bin-DVD1.iso","rb"); fp_write = fopen("

C语言 -- 定时关机程序

<strong><span style="font-size:14px;">C语言  --  定时关机程序</span></strong> <strong></strong><span style="font-size:14px;"></span> <strong><span style="font-size:14px;">特别