learnxinyminutes-docs/zh-cn/bf-cn.html.markdown
Boris Verkhovskiy 00e817db85
All checks were successful
Trigger site build / deploy (push) Has been skipped
CI / lint (push) Successful in 16s
[brainfuck/*] syntax highlight
2024-11-30 13:48:28 -07:00

74 lines
2.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
language: BF
filename: brainfuck-cn.bf
contributors:
- ["Prajit Ramachandran", "http://prajitr.github.io/"]
- ["Mathias Bynens", "http://mathiasbynens.be/"]
translators:
- ["lyuehh", "https://github.com/lyuehh"]
lang: zh-cn
---
Brainfuck 是一个极小的只有8个指令的图灵完全的编程语言。
```bf
除"><+-.,[]"之外的的任何字符都会被忽略 (不包含双引号)。
Brainfuck 包含一个有30,000个单元为0的数组
一个数据指针指向当前的单元。
8个指令如下:
+ : 指针指向的单元的值加1
- : 指针指向的单元的值减1
> : 将指针移动到下一个单元(右边的元素)
< : 将指针移动到上一个单元(左边的元素)
. : 打印当前单元的内容的ASCII值 (比如 65 = 'A').
, : 读取一个字符到当前的单元
[ : 如果当前单元的值是0则向后调转到对应的]
] : 如果当前单元的值不是0则向前跳转到对应的[
[] 组成了一个while循环。很明显它们必须配对。
让我们看一些基本的brainfuck 程序。
++++++ [ > ++++++++++ < - ] > +++++ .
这个程序打印字母'A'。首先,它把 #1 增加到6使用它来作为循环条件
然后,进入循环,将指针移动到 #2 ,将 #2 的值增加到10然后
移动回 #1将单元 #1 的值减1然后继续。循环共进行了6次。
这时,我们在 #1它的值为0#2 的值为60我们移动到
#2将 #2 的内容加上5然后将 #2 的内容打印出来65在
ASCII中表示'A', 所以'A'就会被打印出来。
, [ > + < - ] > .
这个程序从用户的输入中读取一个字符,然后把它复制到 #1。
然后我们开始一个循环,移动到 #2将 #2 的值加1再移动回 #1将 #1
的值减1直到 #1的值为0这样 #2 里就保存了 #1 的旧值,循环结束时我们
在 #1这时我们移动到 #2然后把字符以ASCII打印出来。
而且要记住的一点就是,空格在这里只是为了可读性,你可以将他们写成这样:
,[>+<-]>.
试着思考一下这段程序是干什么的:
,>,< [ > [ >+ >+ << -] >> [- << + >>] <<< -] >>
这段程序从输入接收2个参数然后将他们相乘。
先读取2个输入然后开始外层循环以 #1 作为终止条件,然后将指针移动到
#2然后开始 #2 的内层循环,将 #3 加1。但是这里有一个小问题在内层
循环结束的时候,#2 的值是0了那么下次执行外层循环的时候就有问题了。
为了解决这个问题,我们可以增加 #4 的值,然后把 #4 的值复制到 #2
最后结果就保存在 #3 中了。
```
好了这就是brainfuck了。也没那么难是吧为了好玩你可以写你自己的
brainfuck程序或者用其他语言写一个brainfuck的解释器解释器非常容易
实现但是如果你是一个自虐狂的话你可以尝试用brainfuck写一个brainfuk的
解释器。