当前位置 > 首页 > Asp.net

曲目四:附录、“变态”C代码的手工阅读

1/22/2007 11:48:00 AM来源:Asp.net

这篇是为C写的,不过作为代码阅读习惯和能力的培养,我选到主题上了。希望和大家分享……一笑,呵呵呵。

// 原始代码
#include <stdio.h>
char *a;main(int t,int _,char* a){return!0<t?t<3?main(-79,-13,a+main(-87,1-_,
main(-86,0,a+1)+a)):1,t<_?main(t+1,_,a):3,main(-94,-27+t,a)&&t==2?_<13?
main(2,_+1,"%s %d %d\n"):9:16:t<0?t<-72?main(_,t,
"@n'+,#'/*{}w+/w#cdnr/+,{}r/*de}+,/*{*+,/w{%+,/w#q#n+,/#{l+,/n{n+,/+#n+,/#;#q#n+,/+k#;*+,/'r :'d*'3,}{w+K w'K:'+}e#';dq#'l q#'+d'K#!/+k#;q#'r}eKK#}w'r}eKK{nl]'/#;#q#n'){)#}w'){){nl]'/+#n';d}rw' i;# ){nl]!/n{n#'; r{#w'r nc{nl]'/#{l,+'K {rw' iK{;[{nl]'/w#q#n'wk nw' iwk{KK{nl]!/w{%'l##w#' i; :{nl]'/*{q#'ld;r'}{nlwb!/*de}'c ;;{nl'-{}rw]'/+,}##'*}#nc,',#nw]'/+kd'+e}+;#'rdq#w! nr'/ ') }+}{rl#'{n' ')# }'+}##(!!/")
:t<-50?_==*a?putchar(31[a]):main(-65,_,a+1):main((*a=='/')+t,_,a+1)
:0<t?main(2,2,"%s"):*a=='/'||main(0,main(-61,*a,
"!ek;dc i@bK'(q)-[w]*%n+r3#l,{}:\nuwloca-O;m .vpbks,fxntdCeghiry"),a+1);}

// 把代码格式化一下
#include <stdio.h>
char *a; // can be omitted due to function field
main(int t,int _,char* a){
 return !0<t ?
  t<3 ?
   main(-79,-13,a+main(-87,1-_,main(-86,0,a+1)+a))
   :1
  , t<_ ?
   main(t+1,_,a)
   :3
  , main(-94,-27+t,a)&&t==2 ?
   _<13 ?
    main(2,_+1,"%s %d %d\n")
    :9
   :16
 :t<0 ?
   t<-72 ?
    main(_,t,"@n'+,#'/*{}w+/w#cdnr/+,{}r/*de}+,/*{*+,/w{%+,/w#q#n+,/#{l+,/n{n+,/+#n+,/#;#q#n+,/+k#;*+,/'r :'d*'3,}{w+K w'K:'+}e#';dq#'l q#'+d'K#!/+k#;q#'r}eKK#}w'r}eKK{nl]'/#;#q#n'){)#}w'){){nl]'/+#n';d}rw' i;# ){nl]!/n{n#'; r{#w'r nc{nl]'/#{l,+'K {rw' iK{;[{nl]'/w#q#n'wk nw' iwk{KK{nl]!/w{%'l##w#' i; :{nl]'/*{q#'ld;r'}{nlwb!/*de}'c ;;{nl'-{}rw]'/+,}##'*}#nc,',#nw]'/+kd'+e}+;#'rdq#w! nr'/ ') }+}{rl#'{n' ')# }'+}##(!!/")
    :t<-50 ?
     _==*a ?
      putchar(31[a])
      :main(-65,_,a+1)
     :main((*a=='/')+t,_,a+1)
   :0<t ?
    main(2,2,"%s")
    :*a=='/'||main(0,main(-61,*a,"!ek;dc i@bK'(q)-[w]*%n+r3#l,{}:\nuwloca-O;m .vpbks,fxntdCeghiry"),a+1)
 ;
}

// 翻译成常规语言
// condition ? true : false ; a,b,c generate step
#include <stdio.h>
main(int t,int _,char* a){
 // 逻辑运算优先级,便于理解
 if(!0<t){
  if(t<3)
   main(-79,-13,a+main(-87,1-_,main(-86,0,a+1)+a));
  else
   1;
  if(t<_)
   main(t+1,_,a);
  else
   3;
  if(main(-94,-27+t,a)&&t==2){
   if(_<13)
    return main(2,_+1,"%s %d %d\n");
   else
    return 9;
  }else
   return 16;
 }else{
  if(t<0){
   if(t<-72){
    return main(_,t,"@n'+,#'/*{}w+/w#cdnr/+,{}r/*de}+,/*{*+,/w{%+,/w#q#n+,/#{l+,/n{n+,/+#n+,/#;#q#n+,/+k#;*+,/'r :'d*'3,}{w+K w'K:'+}e#';dq#'l q#'+d'K#!/+k#;q#'r}eKK#}w'r}eKK{nl]'/#;#q#n'){)#}w'){){nl]'/+#n';d}rw' i;# ){nl]!/n{n#'; r{#w'r nc{nl]'/#{l,+'K {rw' iK{;[{nl]'/w#q#n'wk nw' iwk{KK{nl]!/w{%'l##w#' i; :{nl]'/*{q#'ld;r'}{nlwb!/*de}'c ;;{nl'-{}rw]'/+,}##'*}#nc,',#nw]'/+kd'+e}+;#'rdq#w! nr'/ ') }+}{rl#'{n' ')# }'+}##(!!/");
   }else{
    if(t<-50){
     if(_==*a)
      return putchar(31[a]); // pointer compile a[b] with b[a]
     else
      return main(-65,_,a+1);
    }else{
     return main((*a=='/')+t,_,a+1);
    }
   }
  }else{
   if(0<t)
    return main(2,2,"%s");
   else
    // condition compile step a||b
    return *a=='/'||
     main(0,main(-61,*a,"!ek;dc i@bK'(q)-[w]*%n+r3#l,{}:\nuwloca-O;m .vpbks,fxntdCeghiry"),a+1);
  }
 }
}

// 除去不需要的,重构if语句
#include <stdio.h>
main(int t,int _,char* a){
 if(1<t){
  if(t<3)
   main(-79,-13,a+main(-87,1-_,main(-86,0,a+1)+a));
  if(t<_)
   main(t+1,_,a);
  if(main(-94,-27+t,a)&&t==2){
   if(_<13)
    return main(2,_+1,"%s %d %d\n");
   else
    return 9;
  }else
   return 16;
 }else if(t<0){ // 根据语义,可进一步重构
  if(t<-72){
   return main(_,t,"@n'+,#'/*{}w+/w#cdnr/+,{}r/*de}+,/*{*+,/w{%+,/w#q#n+,/#{l+,/n{n+,/+#n+,/#;#q#n+,/+k#;*+,/'r :'d*'3,}{w+K w'K:'+}e#';dq#'l q#'+d'K#!/+k#;q#'r}eKK#}w'r}eKK{nl]'/#;#q#n'){)#}w'){){nl]'/+#n';d}rw' i;# ){nl]!/n{n#'; r{#w'r nc{nl]'/#{l,+'K {rw' iK{;[{nl]'/w#q#n'wk nw' iwk{KK{nl]!/w{%'l##w#' i; :{nl]'/*{q#'ld;r'}{nlwb!/*de}'c ;;{nl'-{}rw]'/+,}##'*}#nc,',#nw]'/+kd'+e}+;#'rdq#w! nr'/ ') }+}{rl#'{n' ')# }'+}##(!!/");
  }else if(t<-50){
   if(_==*a)
    return putchar(a[31]); // 指针编译原理a[b]和b[a],注意是char*
   else
    return main(-65,_,a+1);
  }else{
   return main((*a=='/')+t,_,a+1);
  }
 }else if(0<t){
  return main(2,2,"%s");
 }else{
  if(!(*a=='/'))
   return main(0,main(-61,*a,"!ek;dc i@bK'(q)-[w]*%n+r3#l,{}:\nuwloca-O;m .vpbks,fxntdCeghiry"),a+1);
  else
   return 1; // 等于(*a=='/')
 }
}

// 编译环境main入口,CRTO.C for main(__argc, __argv, _environ);
// 方法的编译原来,返回值的寄存器状态
// 变量的类型转换reinterpret_cast
// 使用一个新的main方法,将旧的用一个新方法'decode'表示
// 根据题设,本程序执行方式为无命令参数,即,argc==1
// 变量的声名规约,改变变量名以方便理解
// 进一步重构if语句
#include <stdio.h>
int decode(int arg1,int arg2,char* sCodec){
 if(1<a