i["string"] 如何用作条件语句?

How does i["string"] work as a condition statement?

检查 IOCCC 中的 this obfuscated code。我正在尝试理解这一点。

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["]<i;++i){--i;}"];read('-'-'-',i+++"hello, world!\n",'/'/'/'));
}
read(j,i,p)
{
    write(j/p+p,i---j,i/i);
}

请解释一下:i["]<i;++i){--i;}"]

这里如何作为条件语句?

C 索引有点古怪。 a[b] 大致等同于 *(a+b)a 降级为指向第一个元素的指针)。但是加法是可交换的,所以 a[b]b[a] 做同样的事情。因此:

i["]<i;++i){--i;}"]

真的只是:

"]<i;++i){--i;}"[i]

但是如果您错过了引号,重新排序会使它看起来像一个正常的 for 循环,从而造成混淆。由于字符串中的所有值都是非零的(因此 "true"),除了 NUL 终止符,循环将在 i 等于该字符串文字的长度时结束。