我正在研究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;}
Run Code Online (Sandbox Code Playgroud)
下面是代码,它位于第一行的中间位置
http://j.mearie.org/post/1181041789/brainfuck-interpreter-in-2-lines-of-c
我不是在问这个背景下它做了什么,但首先是1 []做了什么.
谢谢=)
pax*_*blo 23
在C中,x[7]和之间没有区别7[x].它们都等于*(x+7)(并且*(7+x)因为加法是可交换的),这意味着x数组的第七个元素.
在这个特殊情况(1[d=b])中,首先分配bto 的当前值d,然后计算1[d]与...相同的值d[1].
通过这种方式(offset[base]而不是base[offset]),它允许您将它与赋值结合,否则您需要:
d = b; char *v = d[1];
Run Code Online (Sandbox Code Playgroud)
我想我不应该告诉你,这实际上是非常糟糕的代码,事实证明你必须非常认真地思考它的含义.更好的代码几乎可以立即解读.
它索引到数组/指针d(刚刚分配了值b).它相当于
d=b;
char*v=d[1];
Run Code Online (Sandbox Code Playgroud)
在c中,数组和指针可以在许多方面以相同的方式处理; 最值得注意的是,可以在两者上以相同的方式使用指针算法.d[1]相当于*(d + 1),这相当于*(1 + d)- 相当于- 相当于1[d]!
对于数组类型,使用索引表示法可能更为典型,但(特别是在混淆的代码竞争中;-)两者都可以用于任何一种类型.不要在真实的生产代码中使用这些技巧......虽然你可以证明,它可以使未来的维护者的生活变得困难:-(