【问题标题】:How does i["string"] work as a condition statement?i["string"] 如何作为条件语句工作?
【发布时间】:2016-03-22 02:29:58
【问题描述】:

在 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["]&lt;i;++i){--i;}"]

这里如何作为条件语句工作?

【问题讨论】:

标签: c for-loop conditional-statements obfuscation


【解决方案1】:

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

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

真的只是:

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

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

【讨论】:

  • 和"]
  • @RichardPennington:嗯,最初。 i 正在执行期间更改值。所以第一次检查,当i0 时,肯定是],但后来检查i 是递增的。它发生了什么并不重要。重要的是零或非零,除了字符串的NUL 终止符之外的所有内容都是非零的。
猜你喜欢
  • 1970-01-01
  • 2021-09-10
  • 2012-06-18
  • 1970-01-01
  • 2016-09-07
  • 2015-01-05
  • 1970-01-01
  • 2011-04-20
  • 1970-01-01
相关资源
最近更新 更多