1 是什么意思?

我正在研究160字节的BrainFuck代码,试图找出事情的作用,而我似乎无法弄清楚1 [d = b]的作用。

s[99],*r=s,*d,c;main(a,b){char*v=1[d=b];for(;c=*v++%93;)for(b=c&2,b=c%7?a&&(c&17 ?c&1?(*r+=b-1):(r+=b-1):syscall(4-!b,b,r,1),0):v;b&&c|a**r;v=d)main(!c,&a);d=v;} 

下面是代码,它位于第一行的中间位置
http://j.mearie.org/post/1181041789/brainfuck-interpreter-in-2-lines-of-c

我不是在问这个背景下它做了什么,但首先是1 []做了什么。

谢谢=)

在C中, x[7]7[x]之间没有区别。 它们都等于*(x+7) (和*(7+x)因为加法是可交换的),这意味着x数组的第七个元素。

在这种特殊情况下( 1[d=b] ),首先将b的当前值分配给d ,然后计算1[d] ,它与d[1]相同。

通过这种方式( offset[base]而不是base[offset] ),它允许您将它与赋值组合,否则您需要:

 d = b; char *v = d[1]; 

我想我不应该告诉你,这实际上是非常糟糕的代码,事实certificate你必须非常认真地思考它的含义。 更好的代码几乎可以立即解读。

它索引到数组/指针d (刚刚分配了b的值)。 它相当于

 d=b; char*v=d[1]; 

在c中,数组和指针可以在许多方面以相同的方式处理; 最值得注意的是,可以在两者上以相同的方式使用指针算法。 d[1]相当于*(d + 1) ,这相当于*(1 + d) – 相当于1[d]

对于数组类型,使用索引表示法可能更为典型,但(特别是在混淆的代码竞争中;-)两者都可以在任一类型上使用。 不要在真实的生产代码中使用这些技巧……虽然你可以certificate,它可以使未来的维护者的生活变得困难:-(

 a[b] is *(a + b) b[a] is *(b + a) 

所以

 a[b] is b[a] 

 1[a] is a[1] 

v=1[d=b]d=b; v=d[1]; d=b; v=d[1];