首页 > C/C++语言, 编程语言, 轶事趣闻 > 6个变态的C语言Hello World程序

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

2009年5月25日 发表评论 阅读评论 138,220 人阅读    

下面的六个程序片段主要完成这些事情:

  1. 输出Hello, World
  2. 混乱C语言的源代码

下面的所有程序都可以在GCC下编译通过,只有最后一个需要动用C++的编译器g++才能编程通过。

hello1.c

    #define _________ }
    #define ________ putchar
    #define _______ main
    #define _(a) ________(a);
    #define ______ _______(){
    #define __ ______ _(0x48)_(0x65)_(0x6C)_(0x6C)
    #define ___ _(0x6F)_(0x2C)_(0x20)_(0x77)_(0x6F)
    #define ____ _(0x72)_(0x6C)_(0x64)_(0x21)
    #define _____ __ ___ ____ _________
    #include<stdio.h>
    _____

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++]-0x0C;*(z++)=y[x++]+0x57;
      *(z++)=y[x++]-0x08;*(z++)=y[x++]+0x03;*(z++)=y[x++]-0x06;
      *(z++)=y[x++]-0x08;*(z++)=y[x++]-0x43;*(z++)=y[x]-0x21;
      x=*(--z);while(y[x]!=NULL)putchar(y[x++]);
    }

hello3.c

    #include<stdio.h>
    #define __(a) goto a;
    #define ___(a) putchar(a);
    #define _(a,b) ___(a) __(b);
    main()
    { _:__(t)a:_('r',g)b:_('$',p)
      c:_('l',f)d:_(' ',s)e:_('a',s)
      f:_('o',q)g:_('l',h)h:_('d',n)
      i:_('e',w)j:_('e',x)k:_('\n',z)
      l:_('H',l)m:_('X',i)n:_('!',k)
      o:_('z',q)p:_('q',b)q:_(',',d)
      r:_('i',l)s:_('w',v)t:_('H',j)
      u:_('a',a)v:_('o',a)w:_(')',k)
      x:_('l',c)y:_('\t',g)z:___(0x0)}

hello4.c

    int n[]={0x48,
    0x65,0x6C,0x6C,
    0x6F,0x2C,0x20,
    0x77,0x6F,0x72,
    0x6C,0x64,0x21,
    0x0A,0x00},*m=n;
    main(n){putchar
    (*m)!='\0'?main
    (m++):exit(n++);}

hello5.c

    main(){int i,n[]={(((1<<1)<<(1<<1)<<(1<<
    1)<<(1<<(1>>1)))+((1<<1)<<(1<<1))), (((1
    <<1)<<(1<<1)<<(1<<1)<<(1<<1))-((1<<1)<<(
    1<<1)<<(1<<1))+((1<<1)<<(1<<(1>>1)))+ (1
    <<(1>>1))),(((1<<1)<<(1<<1)<<(1<<1)<< (1
    <<1))-((1<<1)<<(1<<1)<<(1<<(1>>1)))- ((1
    <<1)<<(1<<(1>>1)))),(((1<<1)<<(1<<1)<<(1
    <<1)<<(1<<1))-((1<<1)<<(1<<1)<<(1<<(1>>1
    )))-((1<<1)<<(1<<(1>>1)))),(((1<<1)<< (1
    <<1)<<(1<<1)<<(1<<1))-((1<<1)<<(1<<1)<<(
    1<<(1>>1)))-(1<<(1>>1))),(((1<<1)<<(1<<1
    )<<(1<<1))+((1<<1)<<(1<<1)<<(1<<(1>>1)))
    -((1<<1)<<(1<<(1>>1)))),((1<<1)<< (1<<1)
    <<(1<<1)),(((1<<1)<<(1<<1)<<(1<<1)<<(1<<
    1))-((1<<1)<<(1<<1))-(1<<(1>>1))),(((1<<
    1)<<(1<<1)<<(1<<1)<<(1<<1))-((1<<1)<< (1
    <<1)<<(1<<(1>>1)))-(1<<(1>>1))), (((1<<1
    )<<(1<<1)<<(1<<1)<<(1<<1))- ((1<<1)<< (1
    <<1)<<(1<<(1>>1)))+(1<<1)), (((1<<1)<< (
    1<<1)<<(1<<1)<< (1<<1))-((1<<1)<< (1<<1)
    <<(1<<(1>>1)))-((1<<1) <<(1<< (1>>1)))),
    (((1<<1)<< (1<<1)<<(1<<1)<< (1<<1))- ((1
    <<1)<<(1<<1)<<(1<<1))+((1<<1)<< (1<<(1>>
    1)))), (((1<<1)<<(1<<1) <<(1<<1))+(1<<(1
    >>1))),(((1<<1)<<(1<<1))+((1<<1)<< (1<<(
    1>>1))) + (1<< (1>>1)))}; for(i=(1>>1);i
    <(((1<<1) <<(1<<1))+((1 <<1)<< (1<<(1>>1
    ))) + (1<<1)); i++) printf("%c",n[i]); }

hello6.cpp

下面的程序只能由C++的编译器编译(比如:g++)

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

(全文完)

(转载本站文章请注明作者和出处 酷 壳 – CoolShell.cn ,请勿用于任何商业用途)

——=== 访问 酷壳404页面 寻找遗失儿童。 ===——
好烂啊有点差凑合看看还不错很精彩 (128 人打了分,平均分: 4.73 )
Loading ... Loading ...
  1. 花晴兰
    2012年12月14日11:03 | #1

    最后那个基本上就是BrainF**k的直译了……

  2. mao
    2012年12月24日14:16 | #2

    没营养,纯属娱乐。

  3. 2013年1月10日10:56 | #3

    混淆代码加密……

  4. cokecoffe
    2013年3月12日14:56 | #4

    变态!

  5. dawei
    2013年3月15日22:36 | #5

    不变态!用shellcode的原理,我想是这么样的!

  6. 墨子
    2013年4月22日16:53 | #6

    珍爱生命,远离c++

  7. Hunter_wyg
    2013年6月7日18:18 | #7

    这是哪个 “最乱代码大赛” 什么的把?

  8. 夏天的风
    2013年7月3日09:33 | #8

    牛逼啊

  9. lee9026
    2013年8月27日22:57 | #9

    第一个:利用了宏的层层替代,剥离开来就是一个标准的 main(){putchar(‘H’);……putchar(‘!’);}
    第二个:利用数组和指针,先对赋值Y[0]=0×48=’H’,Y[1]=Y[0]+0x1D=0×65=’e’依次通过偏移量对数组赋值,组后逐个输出。
    第三个:利用goto语言跳转输出。从 __(t)开始,即goto t;t:_(‘H’,j) 即(putchar(‘H’, goto (j)) 依次跳转输出。
    第四个:第一次见main函数可以这样应用,利用函数副作用和条件运算符判断输出。n是数组首地址。m是指针变量,每次自增,最后函数返回数组首地址。
    第五个:利用移位(结核性:L-R)对数组赋值:如第一个值((1<<1)<<(1<<1)<<(1<<1)<<(1<>1)))+((1<<1)<<(1<<1))),即((2<<2<<2<<1) + (2<<2))即(8<<2<<1 + 8)= 64<<1 + 8 = 64 + 8 = 72 = 0×48 ='H'.
    第六个,cpp不熟不懂。
    关于第五个没有输出的问题:其实通过调试可以发现其实是输出了的,只是数值组后一个元素n[13] = 0x0D= '\r',回车,将当前位置移到本行头
    更改下n[13] = 0x0A = '\n' = ((1<<1)<<(1<<1)+(1<<1)), 就可以看到输出了。

  10. 菜鸟小L
    2013年11月25日16:50 | #10

    国外有抽象编程大赛, 貌似最不容易看出来要干啥的code成绩越高

  11. wallace
    2013年12月13日17:31 | #11

    @lee9026
    运行可以输出Hello, world!

  12. wallace
    2013年12月13日17:32 | #12

    @lee9026
    运行可以输出Hello, world! 第5个

  13. 卓尔
    2014年5月6日10:49 | #13

    这是变态吗?这简直是丧心病狂!

  14. IT_BB
    2014年7月1日11:22 | #14

    还行吧,咋一看很是蒙,仔细分析下,这代码都是体力活。

评论分页
1 2 3 914
  1. 2009年6月4日09:13 | #1
  2. 2009年11月9日12:58 | #2
  3. 2009年11月11日12:06 | #3
  4. 2010年5月14日09:01 | #4
  5. 2010年6月9日08:30 | #5
  6. 2010年8月31日17:22 | #6
  7. 2010年11月9日22:30 | #7
  8. 2011年1月26日08:41 | #8
  9. 2011年1月26日11:15 | #9
  10. 2011年1月27日15:42 | #10
  11. 2011年1月28日12:44 | #11
  12. 2011年2月8日18:09 | #12
  13. 2011年5月15日12:34 | #13
  14. 2011年6月3日08:53 | #14
  15. 2011年6月3日11:16 | #15
  16. 2011年6月5日10:47 | #16
  17. 2011年6月5日20:42 | #17
  18. 2011年7月8日09:55 | #18
  19. 2011年7月25日10:23 | #19
  20. 2011年8月18日18:42 | #20
  21. 2011年10月16日09:12 | #21
  22. 2011年11月20日00:21 | #22
  23. 2011年12月17日22:21 | #23
  24. 2012年1月1日15:51 | #24
  25. 2012年4月29日16:13 | #25
  26. 2012年4月29日20:32 | #26
  27. 2012年5月15日09:32 | #27
  28. 2012年8月6日19:02 | #28
  29. 2012年9月18日10:58 | #29
  30. 2012年9月23日23:55 | #30
  31. 2013年3月29日09:24 | #31
  32. 2013年4月17日14:33 | #32
  33. 2013年7月13日18:13 | #33
  34. 2013年11月10日16:21 | #34
  35. 2013年11月10日16:24 | #35
  36. 2013年11月10日17:04 | #36
  37. 2014年3月6日22:43 | #37
  38. 2014年3月7日03:18 | #38
  39. 2014年8月6日08:19 | #39
  40. 2014年8月6日10:08 | #40
  41. 2014年8月7日02:52 | #41