5

以下代码片段来自维基百科,是似乎是标准 Hello World 的序言!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 中的值加 10 a[0],为什么将指针递增 1 并执行++*ptr7 次会导致a[1]等于70?不应该a[1] = 7吗?似乎a[1]通过a[4]被神奇地增加了十倍,我不明白为什么。

4

3 回答 3

2

[]字符表示循环。它之前的 10+秒表示循环将运行多少次。当您了解各种命令的含义以及<<<< -命令的顺序时,这一点就变得很清楚了。

每次循环运行时,它都会执行以下步骤:

> 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
于 2014-01-08T19:22:21.850 回答
2

这个网站上有一个不错的brainfuck 可视化工具:http: //fatiherikli.github.io/brainfuck-visualizer/ 它使brainfuck 语言更容易理解

于 2015-05-05T20:45:40.583 回答
0

使++++++++++cell0 等于 10。然后,[开始循环。在循环中,每次迭代都会向其他单元格添加一个集合数。例如,它每次将 7 添加到单元格 1。循环的最后一行,<<<< -将指针放回 cell0 并递减它。这样,每次迭代都会使 cell0 倒计时。当它达到 0 时,循环停止,程序继续。因此,它将 7 加到 cell1 十次,这个循环使 cell1 = 10*7。

于 2016-12-26T16:55:15.843 回答