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

标签 c for-loop conditional-statements obfuscation

检查 this obfuscated code在 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);}

意思是:

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 循环,从而造成混淆。由于除了 NUL 终止符外,字符串中的所有值都非零(因此为“true”),因此当 i 等于该字符串的长度时,循环将结束字符串文字。

关于c - i ["string"] 如何用作条件语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34303802/

相关文章:

redis - 根据条件增加或重置

c++ - 使用 if 语句的奇怪行为

c - 行首有输出时为“readline”

c++ - 这个 for() 是如何工作的?

c - 嵌套 while 循环在 C 中不起作用

javascript - 在 for 循环中在对象中添加 +1 键

parameters - 在 verilog 中使用带有 for 循环的参数进行位选择

conditional-statements - 狮身人面像中的有条件toctree

c - C中的字符串解析

c - Mac OSX 上的 vector 标量乘法 AVX 段错误