我如何["字符串"]作为条件陈述?

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;}"]

这如何作为一个条件陈述?

Sha*_*ger 6

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等于该字符串文字的长度时,循环将结束.