1 [d = b]是什么意思?

时间:2011-08-29 16:49:33

标签: c obfuscation

我正在研究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 []的作用。

谢谢=)

3 个答案:

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