- 论坛徽章:
- 0
|
最混乱程序解析
3、流程分析
这里主要分析这里t是怎么控制各部分入口, 以及各部分的功能.
SECTION A: t==1的时候,_没用, a没用, 程序启动的时候, 不要加参数, 这个时候t就会为1, 并且这个时候, 只能进入到 main(2,2,"%s")这里, 下一个控制就是 t==2
SECTION B: 2<=t<=13时, _为日期, _的范围是2-13
在这里, t==2时, 打印 On the .... day of Christmas my true love gave to me
如果t<_, 也就是t<日数的时候, t要嵌套自加, 直到与_相等
当t与_相等后, 根据t打印第t-1天的礼物.
打印完所有礼物, 再判断_<13, 如果成立, 则嵌套将_自加.
这里是控制12天的方式.
SECTION C: t<-72 设置打印的段
我们已经将内容解码为26个段, 并分别给出了编码, 我们的编号都是从0向下分直到-25, 因为程序里就是这样控制的.
在这里, 有一个操作, main( _, t, .... ), 将_与t互换, 因为在进入这段控制之前, 都会将t设成小于-72的值, _设为要打印的段, 由于段-25<sec<0, 所以经过这样的互换, 下一次嵌套t就变成-25<sec<0这个范围中的数, 在这个程序里就只能进入-50<=t<0这个段之中.
这里还有个关键操作, 是设置a, 也就是设置内容段.
SECTION D: -50<=t<0 查找内容段起始位置, 跳出条件为t=0
也就是从t<-72之后, 就会进入此流程中, 如果t<0, 就会反复调用main((*a=='/')+t,_,a+1), 直到查找到指定的段. 这里的 *a=='/' 如果一段结束, 此表达式就为1, 则此语句就变成 main(1+t,_,a+1), 如果不为'/', 就成了main(t,_,a+1), 由于进入此段控制时, t是段值的相反数, 如-13, 所以在内容代码中要跳过12个段才能找到所需要打印的内容.直到t为0,并查找到起始地址a
SECTION E: t==0, 设置打印内容
此时如果当前内容代码的第一个字符内容不为'/',则会调用后面的main(0,main(-61,*a,"...................."),a+1);
这里的main(-61,*a,"!ek;dc i@bK'(q)-[w]*%n+r3#l,{}:\nuwloca-O;m.vpbks,fxntdCeghiry")就是设置编码对照表.
这里以前设置的内容代码表中段的超始位置a放到了_这个参数上, 然后将编码对照表也设置上.
这个时候, 我们就拥有了 内容代码表要显示内容和编码对照表. 下面就是如何将它们显示出来.
这里设置的-61, 也只能进入到 -72<=t<-50这个控制中.
SECTION F: -72<=t<-50, 查找编码对照表并显示字符
进入到这个控制的时候, _是内容表中的内容, a则是编码对照表中的内容,要在a中查找到与_一样的字符.
所以main(-65, _, a+1)就是这个作用, 这里的-65保证能进入到此控制中, 并且前面代码中_==*a保证如果_与*a一致了,就调用putchar(31[a]), 否则就会用main(-65,_,a+1)来查找编码对照表中的下一个字符.
SECTION G: 总结一下:
如果想要打印某段内容, 入口就是 t<-72 , 也就是代码中-79, -87, -86, -94, 都是要打印的语句, 同时在打印的时候将第二个参数设置成段的索引值, 如打印第5段, 则将第二个参数设置为-5就可以了.
[ 本帖最后由 alfonso 于 2007-8-2 09:45 编辑 ] |
|