级别: 管理员

- UID1
- 精华
0
- 发帖37
- 财富30 点
- 威望113 点
- 贡献值0 点
- 银元0 块
- 好评度0 点
- 在线时间5(时)
- 注册时间2010-05-29
- 最后登录2010-08-19
|
更多操作▼
[分享]
C语言混乱代码大赛作品分析
复制代码- #include <stdio.h>
- main(t,_,a)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 [email=i@bK]i@bK'(q)-[w]*%n+r3#l,{}:\nuwloca-O;m[/email] .vpbks,fxntdCeghiry"),a+1);}
| ujiZM 怎么样?乍一看蛮吓人的吧?我们今天就分析它啦!可能有人要说,分析这种程序根本没有意义,那我冒昧借用Linus的一句名言“Just for fun”!只当是没事了自我娱乐而已吧!:-) KUF$h Er 如果你有一个支持语法高亮的编辑器,立刻可以看到,程序中有一大段字符串,我们知道,被双引号括起来的字符串里的内容是不会解释成代码语句的(转义字符就算了吧),那我们第一步就是把这些字符串提取出来,现在代码看起来是这样的: Q! Kn|mnN 复制代码- #include <stdio.h>
- main(t,_,a)
- char *a;
- {
- char * STRA="%s %d %d\n";
- char * STRB="@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' ')# }'+}##(!!/";
- char * STRC="%s";
- char * STRD="!ek;dc [email=i@bK]i@bK'(q)-[w]*%n+r3#l,{}:\nuwloca-O;m[/email] .vpbks,fxntdCeghiry";
- 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,STRA):9:16:t<0?t<-72?main(_,t,STRB)
- :t<-50?_==*a?putchar(31[a]):main(-65,_,a+1):main((*a=='/')+t,_,a+1)
- :0<t?main(2,2,STRC):*a=='/'||main(0,main(-61,*a,STRD),a+1);
- }
| L{Q4=p,A 怎么样?代码是不是一下子清晰了很多?好,我们继续观察:在抽取了字符串后,我们发现程序的实际语句只有一个return(如果觉得不可思议你可以搜索一下";" C语言一个分号对应一条语句嘛,可以发现,除了字符串中的内容,的确只有一个分号)。然后我们又发现,语句里有很多"?"和":",这是什么?对了,是三目运算符,而C语言中三目运算符的优先级基本上是最低的(除了赋值和逗号运算符之外,再次搜索代码部分,发现根本没有赋值语句,而逗号运算符只有两个),我们把'?'':'','当作分隔符,任意两个分隔符直接的内容都用大写字母代替,那么程序可以变成这样: |3 ;u"&(P 复制代码- #include <stdio.h>
- #define A !0<t
- #define B t<3
- #define C main(-79,-13,a+main(-87,1-_,main(-86,0,a+1)+a))
- #define D1 1
- #define D2 t<_
- #define E main(t+1,_,a)
- #define F1 3
- #define F2 main(-94,-27+t,a)&&t==2
- #define G _<13
- #define H main(2,_+1,STRA)
- #define I 9
- #define J 16
- #define K t<0
- #define L t<-72
- #define M main(_,t,STRB)
- #define N t<-50
- #define O _==*a
- #define P putchar(31[a])
- #define Q main(-65,_,a+1)
- #define R main((*a=='/')+t,_,a+1)
- #define S 0<t
- #define T main(2,2,STRC)
- #define U *a=='/'||main(0,main(-61,*a,STRD),a+1)
- main(t,_,a)
- char *a;
- {
- char * STRA="%s %d %d\n";
- char * STRB="@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' ')# }'+}##(!!/";
- char * STRC="%s";
- char * STRD="!ek;dc [email=i@bK]i@bK'(q)-[w]*%n+r3#l,{}:\nuwloca-O;m[/email] .vpbks,fxntdCeghiry";
- return
- A ? B ? C : D1 , D2 ? E : F1 , F2 ? G ? H : I : J : K ? L ? M : N ? O ? P : Q : R : S ? T : U ;
- }
| $pjf#P8U 替换的到底正确与否呢?编译,通过,运行,和原来相同!说明替换成功! -xw98 下面的重点就是分析A ? B ? C : D1 , D2 ? E : F1 , F2 ? G ? H : I : J : K ? L ? M : N ? O ? P : Q : R : S ? T : U ;这个语句。 r@olC7& 我们需要复习一下运算符的优先级和结合性的知识: *e%Dg{_ 不同运算符之间按优先级识别,相同优先级的运算符直接按结合性识别,而"?:"运算符的结合性是从右向左的,那么我们可以模拟编译器读入此语句的方式得到: I<c@uXXV;! A "|F.'qZrm A ? ]}p2Tp;1 A ? B %I_&Ehu A ? (B ? ~l(G6/R A ? (B ? C $<
A8gTJ A ? (B ? C : {-o7w0d_ A ? (B ? C : D1) F='Xj@&O A ? (B ? C : D1) , #D=
tX A ? (B ? C : D1) , D2 v$[ @]` A ? (B ? C : D1) , (D2 : EW
~*@H A ? (B ? C : D1) , (D2 : E ;:AG2zE! A ? (B ? C : D1) , (D2 : E : N{ : [/ A ? (B ? C : D1) , (D2 : E : F1) yQ<6p3 A ? (B ? C : D1) , (D2 : E : F1) , F<h&3 A ? (B ? C : D1) , (D2 : E : F1) , F2 Tq9,c#}& A ? (B ? C : D1) , (D2 : E : F1) , (F2 ? P=f<#l"v A ? (B ? C : D1) , (D2 : E : F1) , (F2 ? G
NdM}xh A ? (B ? C : D1) , (D2 : E : F1) , (F2 ? (G ? 2dv|6p A ? (B ? C : D1) , (D2 : E : F1) , (F2 ? (G ? H D9}d]9]$ A ? (B ? C : D1) , (D2 : E : F1) , (F2 ? (G ? H : eA~J4k_ A ? (B ? C : D1) , (D2 : E : F1) , (F2 ? (G ? H : I) ^fA3<| A ? (B ? C : D1) , (D2 : E : F1) , (F2 ? (G ? H : I) : }9MW!Ss A ? (B ? C : D1) , (D2 : E : F1) , (F2 ? (G ? H : I) : J) UeMnc 5y A ? (B ? C : D1) , (D2 : E : F1) , (F2 ? (G ? H : I) : J) : w;lx:j!Vp$ A ? (B ? C : D1) , (D2 : E : F1) , (F2 ? (G ? H : I) : J) : K )fxo)GS A ? (B ? C : D1) , (D2 : E : F1) , (F2 ? (G ? H : I) : J) : (K ? D
/,|pC A ? (B ? C : D1) , (D2 : E : F1) , (F2 ? (G ? H : I) : J) : (K ? L 6&g!ZE'G A ? (B ? C : D1) , (D2 : E : F1) , (F2 ? (G ? H : I) : J) : (K ? (L ? O{;M6U8C\ A ? (B ? C : D1) , (D2 : E : F1) , (F2 ? (G ? H : I) : J) : (K ? (L ? M M3hy5j(b A ? (B ? C : D1) , (D2 : E : F1) , (F2 ? (G ? H : I) : J) : (K ? (L ? M : 7yY1dR<Y A ? (B ? C : D1) , (D2 : E : F1) , (F2 ? (G ? H : I) : J) : (K ? (L ? M : N) 0|],d?-h A ? (B ? C : D1) , (D2 : E : F1) , (F2 ? (G ? H : I) : J) : (K ? (L ? M : (N ? /AK*aRU^ A ? (B ? C : D1) , (D2 : E : F1) , (F2 ? (G ? H : I) : J) : (K ? (L ? M : (N ? O bl(BA}< A ? (B ? C : D1) , (D2 : E : F1) , (F2 ? (G ? H : I) : J) : (K ? (L ? M : (N ? (O ? c28oLT1|D A ? (B ? C : D1) , (D2 : E : F1) , (F2 ? (G ? H : I) : J) : (K ? (L ? M : (N ? (O ? P ^U0apI A ? (B ? C : D1) , (D2 : E : F1) , (F2 ? (G ? H : I) : J) : (K ? (L ? M : (N ? (O ? P : / e~ A ? (B ? C : D1) , (D2 : E : F1) , (F2 ? (G ? H : I) : J) : (K ? (L ? M : (N ? (O ? P : Q) F!z! :yp A ? (B ? C : D1) , (D2 : E : F1) , (F2 ? (G ? H : I) : J) : (K ? (L ? M : (N ? (O ? P : Q) : 5O;/ lX!u A ? (B ? C : D1) , (D2 : E : F1) , (F2 ? (G ? H : I) : J) : (K ? (L ? M : (N ? (O ? P : Q) : R)) 8.Pcr< |