|
楼主 |
发表于 2010-10-20 10:34
|
显示全部楼层
本帖最后由 Rainyboy 于 2010-10-20 10:59 编辑
我来慢慢重构,理解你的代码:
源代码:
- int p(int i, int N)
- {
- return (*((short *)&i+1) || (*((short *)&i+1) = *(short *)&i)) && *(short *)&i < 2*N && *(short *)&i <= (2*N - (*((short *)&i+1))) && printf("%d\n", N - (N - *(short *)&i) * (2*(*(short *)&i < N) - 1)) && (*((unsigned *)&i - 1) -= 5) && ++*(short *)&i;
- }
复制代码 第一步:
- int p(int i, int N)
- {
- short *funcp = (short *)&i;
- return (*(funcp+1) || (*(funcp+1) = *funcp)) && *funcp < 2*N && *funcp <= (2*N - (*(funcp+1))) && printf("%d\n", N - (N - *funcp) * (2*(*funcp < N) - 1)) && (*((unsigned *)&i - 1) -= 5) && ++*funcp;
- }
复制代码 第二步:
- int p(int i, int N)
- {
- short *funcp = (short *)&i;
- if((*(funcp+1) || (*(funcp+1) = *funcp)))
- {
- return *funcp < 2*N && *funcp <= (2*N - (*(funcp+1))) && printf("%d\n", N - (N - *funcp) * (2*(*funcp < N) - 1)) && (*((unsigned *)&i - 1) -= 5) && ++*funcp;
- }
- else
- {
- return 1;
- }
- }
复制代码 第三步:
- int p(int i, int N)
- {
- short *funcp = (short *)&i;
- if((*(funcp+1) > 0))
- {
- return *funcp < 2*N && *funcp <= (2*N - (*(funcp+1))) && printf("%d\n", N - (N - *funcp) * (2*(*funcp < N) - 1)) && (*((unsigned *)&i - 1) -= 5) && ++*funcp;
- }
- else
- {
- *(funcp+1) = *funcp;
- if(*(funcp+1) > 0)
- {
- return *funcp < 2*N && *funcp <= (2*N - (*(funcp+1))) && printf("%d\n", N - (N - *funcp) * (2*(*funcp < N) - 1)) && (*((unsigned *)&i - 1) -= 5) && ++*funcp;
- }
- else
- {
- return 1;
- }
- }
- }
复制代码
第四步:
- int p(int i, int N)
- {
- short *funcp = (short *)&i;
- //i的低位存于funcp中,用于计数
- //i的高位存于funcp+1中,用于储存i的实际值
- if((*(funcp+1) > 0))//该分支用于判断是否初始化
- {
- //if(*funcp < 2*N)//该分支用于判断是否到达打印次数:多余的判断!
- //{
- if(*funcp <= (2*N - (*(funcp+1))))//该分支用于判断是否到达打印次数
- {
- printf("%d\n", N - (N - *funcp) * (2*(*funcp < N) - 1));//执行打印
- *((unsigned *)&i - 1) -= 5;//调整堆栈中eip的值
- ++*funcp;//计数器自增
- }
- return 1;
- //}
- //return 1;
- }
- else
- {
- *(funcp+1) = *funcp;
- if(*(funcp+1) > 0)
- {
- //if(*funcp < 2*N)//该分支用于判断是否到达打印次数:多余的判断!
- //{
- if(*funcp <= (2*N - (*(funcp+1))))//该分支用于判断是否到达打印次数
- {
- printf("%d\n", N - (N - *funcp) * (2*(*funcp < N) - 1));//执行打印
- *((unsigned *)&i - 1) -= 5;//调整堆栈中eip的值
- ++*funcp;//计数器自增
- }
- return 1;
- //}
- //return 1;
- }
- return 1;
- }
- }
复制代码 第五步:
通过上述重构发现你的代码中似乎存在一条多余的判断,见上述注释。
因此,将这条判断减去,并且重新合并后,修正一个版本:
- int p(int i, int N)
- {
- return (*((short *)&i+1) || (*((short *)&i+1) = *(short *)&i)) && *(short *)&i <= (2*N - (*((short *)&i+1))) && printf("%d\n", N - (N - *(short *)&i) * (2*(*(short *)&i < N) - 1)) && (*((unsigned *)&i - 1) -= 5) && ++*(short *)&i;
- }
复制代码 即:
- int p(int i, int N)
- {
- return (*((short *)&i+1) || (*((short *)&i+1) = *(short *)&i)) /*&& *(short *)&i < 2*N*/ && *(short *)&i <= (2*N - (*((short *)&i+1))) && printf("%d\n", N - (N - *(short *)&i) * (2*(*(short *)&i < N) - 1)) && (*((unsigned *)&i - 1) -= 5) && ++*(short *)&i;
- }
复制代码
|
|