2014-01-08 3 views
5

Следующий фрагмент кода из Википедии, и является преамбулой к тому, что кажется стандартным Hello World! Программа в Brainfuck ...Привет, мир! в Brainfuck

1. +++++ +++++    initialize counter (cell #0) to 10 
2. [      use loop to set the next four cells to 70/100/30/10 
3. > +++++ ++    add 7 to cell #1 
4. > +++++ +++++   add 10 to cell #2 
5. > +++     add 3 to cell #3 
6. > +      add 1 to cell #4 
7. <<<< -     decrement counter (cell #0) 
8. ] 

Я понимаю суть того, что происходит здесь, но я не понимаю, механики, что происходит на линиях с 3 по 6. Если +++++ +++++ добавляет 10 к значению a[0], почему приращение указателя на один и выполнение ++*ptr семь раз приводит к a[1], равному 70? Не должно a[1] = 7? Кажется, что a[1] до a[4] магически увеличиваются в десять раз, и я не понимаю, почему.

+3

Цикл работает десять раз. –

+0

Большое спасибо! Я знал, что мне что-то не хватает ... –

+0

Да, ты прав. Кажется, я пропустил/снял вторую часть первого абзаца, описывающего программу. Моя вина. –

ответ

2

Символы [] указывают на цикл. 10 + s перед этим указывает, сколько раз цикл будет запущен. Это становится понятным, когда вы понимаете, что означают различные значения commands, и последовательность команд <<<< -.

Каждый раз, когда проходит цикл, он выполняет следующие действия:

> move the pointer 1 space to the right 
+++++ ++ add 7 to the current pointer 
etc 3 more times > > > 
<<<< - move back to the counter and decrement 

Это имеет эффект добавления "7, 10, 3, 1" в 10 раз. Иными словами, если вы пишете значения в первые 5 мест указателя, как вы запустите цикл, как они в массиве:

[10, 0, 0, 0, 0]  at first 
[9, 7, 10, 3, 1]  after first run 
[8, 14, 20, 6, 2] after second 
... 
[0, 70, 100, 30, 10] up to this, the loop ends since the counter is 0, 
        and control continues 
0

++++++++++ делает cell0 равным 10. Затем [ запускает цикл. В цикле каждая итерация добавляет заданное число в другие ячейки. Например, он каждый раз добавляет 7 к ячейке. Последняя строка цикла <<<< - возвращает указатель на ячейку 0 и уменьшает его. Таким образом, каждая итерация делает отсчет числа cell0. Когда он достигает 0, цикл останавливается и программа продолжается. Поэтому он добавляет 7 к ячейке1 десять раз, и этот цикл делает cell1 = 10 * 7.

Смежные вопросы