Что означает 1 [d = b]? - PullRequest
       49

Что означает 1 [d = b]?

2 голосов
/ 29 августа 2011

Я работал над 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 ]

23 голосов
/ 29 августа 2011

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

Полагаю, мне не нужно было говорить, что на самом деле это очень плохой код, о чем свидетельствуеттем, что вы должны очень серьезно задуматься о том, что это значит.Лучший код будет почти мгновенно расшифрован.

6 голосов
/ 29 августа 2011

Индексируется в массив / указатель d (которому было присвоено значение b). Это эквивалентно

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

В c массивы и указатели могут обрабатываться одинаково во многих отношениях; наиболее примечательно, что можно использовать арифметику указателей одинаково для обоих. d[1] эквивалентно *(d + 1), что тривиально эквивалентно *(1 + d) - что, в свою очередь, эквивалентно 1[d]!

Использование индексной нотации может быть более типичным для типов массивов, но (особенно в состязаниях с запутанным кодом ;-) оба могут использоваться для любого типа. Не используйте такие приемы в реальном, производственном коде, хотя ... как вы можете засвидетельствовать, это может осложнить жизнь будущим сопровождающим: - (

3 голосов
/ 29 августа 2011
a[b] is *(a + b)
b[a] is *(b + a)

So

a[b] is b[a]

И

1[a] is a[1]

v=1[d=b] - это d=b; v=d[1];

...