Kes*_* GN 3 c obfuscation for-loop conditional-statements
检查IOCCC中的这个混淆代码.我试图理解这一点.
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);}
Run Code Online (Sandbox Code Playgroud)
手段:
int i;
main()
{
for(;i["]<i;++i){--i;}"];read('-'-'-',i+++"hello, world!\n",'/'/'/'));
}
read(j,i,p)
{
write(j/p+p,i---j,i/i);
}
Run Code Online (Sandbox Code Playgroud)
请解释一下: i["]<i;++i){--i;}"]
这如何作为一个条件陈述?
C索引有点时髦.a[b]大致相当于*(a+b)(a降级为指向第一个元素的指针).但是,加法是可交换的,所以a[b]和b[a]做同样的事情.从而:
i["]<i;++i){--i;}"]
Run Code Online (Sandbox Code Playgroud)
真的只是:
"]<i;++i){--i;}"[i]
Run Code Online (Sandbox Code Playgroud)
但如果错过引号,重新排序会使它看起来像一个标准化的循环.由于除了NUL终结符之外,字符串中的所有值都不为零(因此为"true"),因此当i等于该字符串文字的长度时,循环将结束.