我正在研究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 []的作用。
谢谢=)
答案 0 :(得分:23)
在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];
我想我不应该告诉你这实际上是非常坏代码,事实证明你必须非常认真地思考它的含义。更好的代码几乎可以立即解读。
答案 1 :(得分:6)
它索引到数组/指针d
(刚刚分配了b
的值)。它相当于
d=b;
char*v=d[1];
在c中,数组和指针可以在许多方面以相同的方式处理;最值得注意的是,可以在两者上以相同的方式使用指针算法。 d[1]
相当于*(d + 1)
,这相当于*(1 + d)
- 相当于1[d]
!
对于数组类型,使用索引表示法可能更为典型,但(特别是在混淆的代码竞争中;-)两者都可以用于任何一种类型。不要在真实的生产代码中使用这些技巧......正如你可以证明的那样,它可以使未来维护者的生活变得困难: - (
答案 2 :(得分:3)
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];