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];