关于ioccc程序1984年anonymous.c的分析
源程序如下:
int i;main(){for(;i["]<i;++i){--i;}"];read('-'-'-',i+++"hell\
o, world!\n",'/'/'/'));}read(j,i,p){write(j/p+p,i---j,i/i);}
分析:
上述代码等同于:
int i;main(){for(;i["12345678901234"];read('-'-'-',i+++"hello,world!\n",'/'/'/'));}read(j,i,p){write(j/p+p,i---j,i/i);}
分析步骤1:i["]<i;++i){--i;}"]
这个的计算结果为引号里面的字符串的长度,所以我进行了第二步分析:
int i;main(){for(;i["12345678901234"];printf(i+++"hello,world!\n"));}
程序执行了14行,这很正常,因为程序里面包含循环,我们将循环结束的条件设置的是14,所以我们必须在printf中包含步长;i+++"hello,world!\n"实现了之一步骤,这样一来,和程序的结果不符合,也就是我们的替代出现了一些失误,这是因为我们设置了一个14次的循环,所以我们打印了14行,而由于i的值每次都在改变,printf在处理类似printf(n+"fdsaf")(n为整数)的时候,会打印从n+1个字符开始的剩余字符串,所以我们如果要完整的替换,只需要将hello,world!\n字符串一个一个输出就可以了;我没有找到write函数的用法,不过从第3个参数i/i来看,应该是一个一个输出字符串,所以程序使用了自定义了一个read函数